目录
2. 创建item布局文件(Res/layout/xxx.xml)
(1) 线性布局管理器(LinearLayoutManager)
(2) 网格布局管理器(GridLayoutManager)
(3) 瀑布网格布局管理器(StaggeredGridLayoutManager)
RecyclerView循环视图,可实现各种增强型列表,包括线性列表布局,普通网格布局,瀑布流网格布局等,并对循环视图进行动态更新操作。
1. Activity中设置控件
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
2. 创建item布局文件(Res/layout/xxx.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/itemTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
3. 创建MyHolder(持有者)
private class MyHolder extends RecyclerView.ViewHolder{
TextView textView;
public MyHolder(@NonNull View itemView) {
super(itemView);
textView=itemView.findViewById(R.id.itemTextView);
}
}
4. 创建MyAdapter(适配器)
private class MyAdapter extends RecyclerView.Adapter<MyHolder>{
private String str[]={"str1","str2"};
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(MainActivity.this).inflate(R.layout.xxx,parent,false);
return new MyHolder(view);
}
public void onBindViewHolder(@NonNull MyHolder holder, int position) {
holder.textView.setText(str[position]);
}
public int getItemCount() {
return str.length;
}
}
5. RecyclerView设置布局管理器
使用setLayoutManager()方法设置布局管理器。
布局管理器有三种:
(1) 线性布局管理器(LinearLayoutManager)
构造方法参数为环境
提供setOrientaition()方法设置方向,取值为LineraLayout.VERTICAL或LinearLayout.HORIZONTAL
提供setReverseLayout()方法设置是否为相反方向开始布局,默认false;如果设置为true,那么垂直方向从下往上布局,水平方向从右往左布局。
RecyclerView recyclerView=findViewById(R.id.recyclerView);
//线性布局管理器
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
(2) 网格布局管理器(GridLayoutManager)
构造方法参数为环境、列数
提供setSpanCount()方法设置列数
提供setSpanSizeLookup()方法设置列表项的占位规则;默认一项占一列,如果想某项占多列,就可以在此设置占位规则,即由GridLayoutManager.SpanSizeLookup派生具体的实现类
RecyclerView recyclerView=findViewById(R.id.recyclerView);
//网格管理器
GridLayoutManager gridLayoutManager=new GridLayoutManager(this,5);
//设置占列数
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
public int getSpanSize(int position) {
if(position==0|position==1){
//第一项和第二项占两列
return 2;
}
else {
//其他项占一列
return 1;
}
}
});
//设置网格管理器
recyclerView.setLayoutManager( gridLayoutManager ));
(3) 瀑布流网格布局管理器(StaggeredGridLayoutManager)
构造方法参数为列数、方向(LineraLayout.VERTICAL或LinearLayout.HORIZONTAL)
提供setSpanCount()方法设置列数
提供setOrientaition()方法设置方向,取值为LineraLayout.VERTICAL或LinearLayout.HORIZONTAL
提供setReverseLayout()方法设置是否为相反方向开始布局,默认false;如果设置为true,那么垂直方向从下往上布局,水平方向从右往左布局。
RecyclerView recyclerView=findViewById(R.id.recyclerView);
//瀑布流网格管理器
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayout.VERTICAL));
6. RecyclerView设置适配器
recyclerView.setAdapter(new MyAdapter());
7. 如果列表内容存在多种item的情况
需要对每种item创建各自的MyHolder_1、MyHolder_2.....
将extends Adapter<?>中?换成所有MyHolder共同的父类
并加入getItemViewType(int position)方法用于返回item类型
public int getItemViewType(int position) {
return typeArray[position];
}
8. 获取列表当前位置、滑动列表到指定位置
RecyclerView recyclerView=findViewById(R.id.~);
//获取列表当前位置
//获取线型布局管理者
LinearLayoutManager linearLayoutManager= (LinearLayoutManager) recyclerView.getLayoutManager();
//第一个显示的位置
int firstItemIndex=linearLayoutManager.findFirstVisibleItemPosition();
//第一个完整显示的位置
int firstCompletelyItemIndex=linearLayoutManager.findFirstCompletelyVisibleItemPosition();
//最后一个显示的位置
int lastItemIndex=linearLayoutManager.findLastVisibleItemPosition();
//最后一个完整显示的位置
int lastCompletelyItemIndex=linearLayoutManager.findLastCompletelyVisibleItemPosition();
//滑动到指定位置
recyclerView.scrollToPosition( int postion );
9. 动态修改数据
可以对适配器RecyclerView.Adapter使用以下方法动态修改数据:
notifyItemInserted() 通知适配器在指定位置已插入新项
notifyItemRemoved() 通知适配器在指定位置已删除原有项
notifyItemChanged() 通知适配器在指定位置的项目已发生变化
notifyDataSetChanged() 通知适配器整个列表已发生变化
10. RecyclerView实时修改UI
在RecyclerView的各个Item中设置Timer计时器用于实时更新Item的UI;需要注意Timer的执行UI修改时间需要在Item的可见时间中,如果Item处于不可见状态,不应执行UI修改,否则会出现混乱。
//例
Timer timer_ui=new Timer();
TimerTask timerTask_ui=new TimerTask() {
public void run() {
LinearLayoutManager linearLayoutManager= (LinearLayoutManager) recyclerView.getLayoutManager();
int first=linearLayoutManager.findFirstVisibleItemPosition();
int last=linearLayoutManager.findLastVisibleItemPosition();
if(first<=position&&position<=last){
//执行UI修改
handler_ui.sendEmptyMessage();
}
}
};
timer_ui.schedule(timerTask_ui,0,300);
11. RecyclerView的点击监听
//建议使用
recyclerView.addRecyclerListener(new RecyclerView.RecyclerListener() {
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
}
});
//已过时
recyclerView.setRecyclerListener(new RecyclerView.RecyclerListener() {
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
}
});
12. 工具属性
tools:itemCount属性用于显示item数量
tools:listitem属性用于显示item的layout文件
<androidx.recyclerview.widget.RecyclerView
tools:itemCount="9"
tools:listitem="@layout/item_rank"
13. 添加分隔
可用空白分隔或自定义分隔
(1)创建继承RecyclerView.ItemDecoration类的自定义类,在自定义类的onDraw()方法或onDrawOver()方法中绘制分隔。onDraw()方法在绘制item前绘制,会被item遮挡;onDrawOver()方法在绘制item后绘制,不会被item遮挡。
(2)使用addItemDecoration()方法向RecyclerView对象中添加分隔。
//自定义分隔类
public class MyItemDecoration extends RecyclerView.ItemDecoration{
@Override
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.onDraw(c, parent, state);
//绘制item前绘制-会被item遮挡
}
public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
super.onDrawOver(c, parent, state);
//绘制item后绘制-不会被item遮挡
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStrokeWidth(2);
//获取子item数量
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
//获取子item
View child = parent.getChildAt(i);
int bottom = child.getBottom();
c.drawLine(parent.getLeft()+20, bottom, parent.getRight()-20, bottom, paint);
}
}
}
RecyclerView recyclerView=findViewById(R.id.~);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
//添加分隔-自定义分隔
recyclerView.addItemDecoration(new MyItemDecoration());
//添加分隔-空白分隔
recycelrView.addItemDecoration(new SpacesItemDecoration(3));
tag: recycler 、Recycler 、recyclerView 、RecyclerView、Timer 、UI、循环视图、列表控件、List,循环控件,列表