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();
}
}