RecyclerView简单使用及Adapter模板代码(一)

        最近又看了一下RecyclerView,但是对多条目类型的RecyclerView的使用,还是没有清楚。今天记录一下自己总结出的RecyclerView的简单使用流程。总之是一些自己的思考,最后我会谈一谈:从一个小白的角度来分析,为什么有RecyclerView,为什么他被设计成这个样子?作为参考,忘了回来看一下,以后当然要继续去看源码,继续去了解自定义LayoutManger等等高级用法和设计思想。

        今天就浅浅地记录一下吧。

  • 首先要知道什么情况下使用RecyclerView?
    • 当要展示一个列表的时候,应该要考虑到用RecyclerView,特别是这个列表需要滑动的时候,那大概率是要使用RecyclerView了;
    • 另外如果有翻页需求,而不是僵硬的滑动,使用ViewPager2
    • 总结:RecyclerView是为了展示重复信息的一个滑动列表
  • 使用的基本流程
    • 第一步:布局文件声明一个RecyclerView,就跟使用一个TextView一样简单;
    • 第二步:在使用这个RecyclerView的界面,初始化RecyclerView,其实就跟textView的设置Text一样:使用findViewById拿到RecyclerView的引用,调用它的setAdapter,setLayoutManager,setLayoutManager基本上就是默认的那几个,什么线性的,网格的。(这个过程只需要关注Adapter即可)。最后使用adapter加载数据,类似:adapter.setData,这个方法要我们自己实现。
    • 第三步:实现Adapter,实现四个方法,onViewHolderCreateonBindViewHolder,getItemCount,setData(这个方法是非接口实现方法,是我自己认为需要的):
      • Item:每一个条目,在接下来用Item来表示;
      • ViewHolder是:持有一个Item的所有子View的对象,实现一个bind方法,拿到adapter里面bind过来的数据,整体直接bind到视图上,下面会展示一个模板代码;
        • 这是什么,因为要使用RecyclerView这种滑动列表,其实要定义每一个条目的View,每一个条目可能包含多个子View,比如一个ImageView一个textView,那么将adapter中的数据如何显示到这所有的子view中,就需要一个类,来描述这个过程,同事多中条目类型,就创建多个ViewHolder实现类就可以了;
        • 总结:ViewHolder就类似是一个Acitivity或者是一个Fragment,持有很多子View,并且提供一个方法bind,bind里面,将设置所有的子View的显示,也就是调用什么setImage,setText这类方法。
      • onViewHolderCreate需要实现为:我们为其提供一个ViewHolder(new一个),可以根据ViewType来创建不同的ViewHolder,最重要的是,我们要使用LayoutInflater来解析XML文件,这个xml文件是条目的布局文件,然后把返回的View对象,作为参数传递给ViewHolder的构造函数。
        • 这个方法存在的意义就是,当RecyclerView需要ViewHolder的时候,为什么需要ViewHolder,因为ViewHolder和界面上的显示出来的Item的View是相关联的,创建一个ViewHolder,就意味着创建好了一个View。(先简单这样理解吧,之后这一段需要再优化);
        • 这个方法可以简单理解为:生产ViewHolder
        • 这个方法就做了一件事:当recyclerView需要什么ViewHolder的时候,你就把这个ViewHolder new出来,传递给他,就完事了
        • ViewHolder内部包含引用,就是各种子View的引用,因此在之后数据改变的时候,直接调用引用的setText方法,就不用findViewById了,findViewById只在创建这个ViewHolder的时候调用了一次,因此,性能提高了很多。
        • 性能提高的本质:前面也说了,引用是一个地址,可以直接访问;而findViewById需要遍历View树,这很明显性能就下降了很多;
      • onBindViewHolder:这个方法的含义就是:当RecyclerView显示position这个索引的Item时,你需要这个Item显示什么数据。
        • 知道了这个方法的含义,就很容易实现这个方法了,其实就是在这里调用各种set方法,当然如果为了通用性更好,可以直接调用bind方法,将adapter整体数据的list中的itemData,bind到ViewHolder中。当然,这个bind方法,需要在ViewHolder内部实现。
    • 第四步:实现ViewHolder,其实说到这里,前面已经把ViewHolder的实现基本上说了
      • 总结:ViewHolder接口是用来标记的,没有需要实现的方法,具体需要实现一下内容
      • 内部属性:各子View的引用
      • 构造函数:接受onCreateViewHolder传过来的View对象,并且使用findViewById,得到item布局文件中的子View对象,然后把这些对象给ViewHolder属性里面的引用赋值
      • bind方法:接受一个数据ItemData,对每一个子View进行界面显示,即调用View.set系列方法
  • 数据刷新:数据的持有者是adapter,其实adapter的核心,因为adapter的核心其实就是onViewHolderBind这个方法,这个方法的作用就是显示item的数
    • 那么更新数据的方法依然应该在adapter里面实现,就像第一次给adapter数据使用的方法一样:
      • 一是通过构造函数直接给adapter;
      • 二是定义一个setData给adapter;
      • 总结,但是以上两种方式都不包含之后整体数据列表发生变化,如果发生了变化。
    • 就应该在adapter里面定义一些更新数据的方法,例如updateData,直接替换整体数据,或者addItem之类的,removeItem之类的,别忘了调用相应的提醒方法:
      • notifyDataSetChanged,整体数据刷新;
      • notifyItemInserted,插入刷新;
      • notifyItemRemoved,删除刷新;
      • 总结,还有几个,这几个配合使用就可以了,总之就是,数据刷新的方法,实现在adapter中,然后activity中调用。
  • 另外还有一些关于事件点击,比较简单的一个方法:首先肯定想到的是在Framgment或者MainActiviy中进行事件的处理,首先定义一个事件点击接口,回调参数为position:
    • 本质:需要将子view的点击事件传递到处理点击事件的地方,加入点击一个条目不会影响到activity或者recyclerView的整体数据,按照我的理解就是,如果这个item的点击,不需要触发界面重绘(或者数据),那么就不需要将这个点击事件传递出来:
      • 不需要传递出来:比如说点击一个条目,放大显示上面的图片,没准我直接ViewHolder里面对View事件setOnClickListener,然后new Dialog,就可以了;
      • 需要传递出来:但是比如说,点击一个条目,就删除自己,那么就需要传递出来了,要传到数据源,Activity中。
    • 对于需要传递到Activity中的点击事件,有可能还要用到相应的数据,因此也要传递出position,所以要在ViewHolder中的setOnClickListener里面调用getAdapterPosition,将这个position传递出来;
    • 那么如何才能将点击事件从ViewHolder里面传递到Activity呢,通过Adapter:因为创建ViewHolder是在Adapter,此时可以在onCreateViewHolder中在构造函数中将接口对象传递进去;
    • 那么这个接口对象可以通过adapter的构造函数传递到adapter;
    • 然后就只需要在activity中使用匿名内部类,就可以将这个接口对象传递过去了;
    • 这样每一个ViewHolder,都会持有这个对象,就都可以把点击事件传递出来了。

总结:关于RecyclerView的最基本的使用就到这里吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值