赞
踩
概述:
Android 控件 RecyclerView
从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活
使用:
一、引入依赖
二、在布局中使用
三、布局管理器的使用和适配
四、Adapter中方法调用顺序:
五、使用RecyclerView实现多布局
一、引入依赖
implementation 'com.android.support:recyclerview-v7:28.0.0'
二、在布局中使用
xml文件:activity_main
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvlist"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
//match_parent:充满父布局
//wrap_content:包围子内容
三、布局管理器的使用和适配
在activity中加载://在oncreate中:其中传入适配器的list是自定义的一些数据,一些字符串,不重要。布局管理器这里有三个,其实根据需要任意选择一个就好。
private RecyclerView recyclerView; setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.rvlist); // 定义一个线性布局管理器 LinearLayoutManager lmanager = new LinearLayoutManager(this,RecyclerView.VERTICAL,false); //定义一个网格布局管理器 GridLayoutManager gmanage = new GridLayoutManager(this,4,RecyclerView.VERTICAL,false); //定义一个瀑布流布局管理器 StaggeredGridLayoutManager smanage = new StaggeredGridLayoutManager(3,RecyclerView.VERTICAL); // 参数: // VERTICAL:垂直 // HORIZONTAL:水平 // 参数reverseLayout:是否反转 // 参数spanCount,几行几列 // 设置布局管理器 recyclerView.setLayoutManager(lmanager); //添加分割线 recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); DemoAdapter adapter = new DemoAdapter(this,list); recyclerView.setAdapter(adapter); // 设置adapter
设置adapter:自定义DemoAdapter继承RecyclerView.Adapter
,继承后实现父类中四个抽象方法:
getItemCount
getItemViewType
onCreateViewHolder
onBindViewHolder
在onCreateViewHolder中加载需要设置到RecyclerView容器中的子布局,然后将子布局传入到ViewHolder 中
@NonNull@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_demo,parent,false);
return new viewHolder(view);
}
其中viewHolder一般会声明为adapter的内部类,用来找到子布局中对应的控件,子布局里面就是一个textView ,
viewHolder中代码为:
private class viewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public viewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.demoView);
}}
修改getItemCount方法:使得其返回数据为list的大小,根据list数据确定RecyclerView中子布局加载多少次:
@Overridepublic int getItemCount() {
return list.size();
}
最后一个方法onBindViewHolder是用来绑定数据到子布局的:其中的BaseEntity 是一个数据源,随便定义的一个类
@Overridepublic void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position)
{
BaseEntity baseEntity = list.get(position);
((viewHolder)holder).textView.setText(baseEntity.toString());
}
四、Adapter中方法调用顺序:
getItemCount–>getItemViewType–>onCreateViewHolder–>onBindViewHolder
五、使用RecyclerView实现多布局
在自定义DemoAdapter中:
1、定义两种类型:
private int TYPE_ONE = 1;
private int TYPE_TWO = 2;
2、重写上面没有用到的getItemViewType方法,设置不同的条件返回不同类型,选择当前数据用什么布局加载
@Override
public int getItemViewType(int position) {//position:当前数据
if(position % 2 == 0){
return TYPE_ONE;
} else {
return TYPE_TWO;
}
}
3、在onCreateViewHolder中根据返回的不同条件不同类的类型加载不同的子布局,其中参数itemType当getItemViewType方法被调用后,就会变成该方法返回的记录类型的值
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int itemType) {
View view;
if(itemType == TYPE_ONE){
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.xxx, viewGroup, false);
return new ItemOneHolder(view);
} else if(itemType == TYPE_TWO){
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.xxx, viewGroup, false);
return new ItemTwoHolder(view);
}
return null;
}
4、同时也要设置两个不同的内部类,毕竟加载了两个不同的布局
class ItemOneHolder extends RecyclerView.ViewHolder{
private TextView nText;
public ItemOneHolder(@NonNull View itemView) {
super(itemView);
nText = itemView.findViewById(R.id.xx);
}
}
class ItemTwoHolder extends RecyclerView.ViewHolder{
private TextView nText;
public ItemTwoHolder(@NonNull View itemView) {
super(itemView);
nText = itemView.findViewById(R.id.xx);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。