RecyclerView使用

一、引入相关包

在app/build.gradle文件中添加如下依赖:

implementation 'androidx.recyclerview:recyclerview:1.0.0'

注:包的版本查询可在https://mvnrepository.com/中查找。

二、在布局文件中引用RecyclerView

示例:

<androidx.recyclerview.widget.RecyclerView
	android:id="@+id/recycler_view"
	android:layout_width="match_parent"
	android:layout_height="match_parent" />

三、创建item布局文件

RecyclerView显示的是多个相同的item,创建布局文件设置item的布局。

示例:

fruit_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
    	android:id="@+id/fruit_image"
        android:layout_width="wrap_content"
    	android:layout_height="wrap_content"/>
    
    <TextView
    	android:id="@+id/fruit_name"
        android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"/>
</LinearLayout>

四、创建适配器Adapter

RecyclerView一个适配器Adapter,实现将数据显示到相应的view上。

示例:

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder>{
    private List<Fruit> mFruitList; //设置成员变量,用于存放数据。
    
    //创建ViewHolder类,用于保存item子View。防止多次使用findViewById影响性能
    static class ViewHolder extends RecyclerView.ViewHolder{
        View fruitView;
        ImageView fruitImage;
        TextView fruitName;
        
        public ViewHolder(View view){
            super(view);
            fruitView = view;
            fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
            fruitName = (TextView) view.findViewById(R.id.fruit_name);
        }
    }
    
    public FruitAdapter(List<Fruit> fruitList){
        mFruitList = fruitList;
    }
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.fruit_item, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position){
        Fruit fruit = mFruitList.get(position);
        holder.fruitImage.setImageResource(fruit.getImageId());
        holder.fruitName.setText(fruit.getName());
    }
    
    @Override
    public int getItemCount(){
        return mFruitList.size();
    }
}

五、设置RecyclerView

获取RecyclerView控件,设置LayoutManager和adapter。

示例:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler.view);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);//设置布局模型,LinearLayout默认情况下为纵向布局
layoutManger.setOrientation(LinearLayoutManager.HORIZONTAL);//设置为横向布局
recyclerView.setLayoutManager(layoutManager);
FruitAdapter adapter = new FruitAdapter(fruitList);
recyclerView.setAdapter(adapter);

设置为流式布局:

通过使用StaggeredGridLayoutManager设置流式布局,该类的构造函数第一个参数为指定布局的列数第二个参数为指定布局方向

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler.view);
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, 
                        StaggeredGridLayoutManager.VERTICAL);//设置布局模型,LinearLayout默认情况下为纵向布局
layoutManger.setOrientation(LinearLayoutManager.HORIZONTAL);//设置为横向布局
recyclerView.setLayoutManager(layoutManager);
FruitAdapter adapter = new FruitAdapter(fruitList);
recyclerView.setAdapter(adapter);

六、设置子项即Item的监听事件

在Adapter类文件中的onCreateViewHolder方法中添加监听事件。

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder>{
    private List<Fruit> mFruitList; //设置成员变量,用于存放数据。
    
    //创建ViewHolder类,用于保存item子View。防止多次使用findViewById影响性能
    static class ViewHolder extends RecyclerView.ViewHolder{
        View fruitView;
        ImageView fruitImage;
        TextView fruitName;
        
        public ViewHolder(View view){
            super(view);
            fruitView = view;
            fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
            fruitName = (TextView) view.findViewById(R.id.fruit_name);
        }
    }
    
    public FruitAdapter(List<Fruit> fruitList){
        mFruitList = fruitList;
    }
    
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.fruit_item, parent, false);
        ViewHolder holder = new ViewHolder(view);
        
        //设置监听事件
        holder.fruitImage.setOnClickListener(new View.OnClickListener(){
        	@Override
            public void onClick(View v){
                int position = getAdapterPosition(); //获取数据的位置
                Fruit fruit = mFruitList.get(position);
                Toast.makeText(v.getContext(), "点击了", Toast.LENGTH_SHORT).show();
            }
        });
        
        return holder;
    }
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position){
        Fruit fruit = mFruitList.get(position);
        holder.fruitImage.setImageResource(fruit.getImageId());
        holder.fruitName.setText(fruit.getName());
    }
    
    @Override
    public int getItemCount(){
        return mFruitList.size();
    }
}
posted on 2020-12-25 02:26  零_壹  阅读(78)  评论(0编辑  收藏  举报