RecyclerView列表控件的使用

目录

1. Activity中设置控件

2. 创建item布局文件(Res/layout/xxx.xml)

3. 创建MyHolder(持有者)

4. 创建MyAdapter(适配器)

5. RecyclerView设置布局管理器

(1) 线性布局管理器(LinearLayoutManager)

(2) 网格布局管理器(GridLayoutManager)

(3) 瀑布网格布局管理器(StaggeredGridLayoutManager)

6. RecyclerView设置适配器

7. 如果列表内容存在多种item的情况

8. 获取列表当前位置、滑动列表到指定位置

9. 动态修改数据

10. RecyclerView实时修改UI

11. RecyclerView的点击监听

12. 工具属性

13. 添加分隔


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.VERTICALLinearLayout.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.VERTICALLinearLayout.HORIZONTAL)

提供setSpanCount()方法设置列数

提供setOrientaition()方法设置方向,取值为LineraLayout.VERTICALLinearLayout.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,循环控件,列表

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下嗷呜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值