RecyclerView 的简单使用方法

1.RecyclerView的使用方法(使用的Android Studio开发)
首先是recyclerview的配置问题,recyclerview是要导入android.support.v7.widget.RecyclerView的包。还要在Gradle Scripts中添加

compile 'com.android.support:recyclerview-v7:24.0.0'

,然后同步。
2.使用RecyclerView实现的主要是内容是Item的添加和删除以及ListView,GridView和瀑布流的切换,还有就是Item的长按和短按的点击事件。

ListView和GridView的切换还是很好用,代码也很简单。主要是实现了以下代码。

0.接入

build.gradle 文件中加入

compile 'com.android.support:recyclerview-v7:24.0.0'
1.创建对象
RecyclerView recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
2.设置显示规则
recyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));

RecyclerView 将所有的显示规则交给一个叫 LayoutManager 的类去完成了。

LayoutManager 是一个抽象类,系统已经为我们提供了三个默认的实现类,分别是 LinearLayoutManager GridLayoutManagerStaggeredGridLayoutManager,从名字我们就能看出来了,分别是:线性显示、网格显示、瀑布流显示。当然你也可以通过继承这些类来扩展实现自己的 LayougManager

3.设置适配器
recyclerview.setAdapter(adapter);

适配器,同 ListView 一样,用来设置每个item显示内容的。

通常,我们写 ListView 适配器,都是:

  • 首先继承 BaseAdapter

  • 实现四个抽象方法;

  • 创建一个静态 ViewHolder

  • getView() 方法中判断 convertView 是否为空,创建还是获取 ViewHolder 对象。


RecyclerView 也是类似的步骤:

  • 首先继承RecyclerView.Adapter<VH>类;

  • 实现三个抽象方法;

  • 创建一个静态的 ViewHolder


不过 RecyclerView ViewHolder 创建稍微有些限制,类名就是上面继承的时候泛型中声明的类名(或者应该说,上面泛型中的类名需要是这个holder的类名);并且 ViewHolder 必须继承自RecyclerView.ViewHolder类。

public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.VH> {
 
 private
List<Data> dataList;
 private Context context;

 public DemoAdapter(Context context, ArrayList<Data> datas) {
   this.dataList = datas;
   this.context = context;  }

 @Override  public VH onCreateViewHolder(ViewGroup parent, int viewType) {
   return new VH(View.inflate(context, android.R.layout.simple_list_item_2, null));  }

 @Override  public void onBindViewHolder(VH holder, int position) {    holder.mTextView.setText(dataList.get(position).getNum());  }

 @Override  public int getItemCount() {
   return dataList.size();
 }
 
 public static class VH extends RecyclerView.ViewHolder {
   
   TextView mTextView;
   
   public VH(View itemView) {
     mTextView = (TextView) itemView.findViewById(android.R.id.text1);
   }  }
}

更多方法

除了常用方法,当然还有不常用的。

瀑布流与滚动方向

前面已经介绍过,RecyclerView实现瀑布流,可以通过一句话设置:recycler.setLayoutManager(new StaggeredGridLayoutManager(2, VERTICAL))就可以了。

其中 StaggeredGridLayoutManager 第一个参数表示列数,就好像 GridView 的列数一样,第二个参数表示方向,可以很方便的实现横向滚动或者纵向滚动。

使用 demo 可以查看:Github 【RecyclerView简单使用

添加删除 item 的动画

ListView 每次修改了数据源后,都要调用 notifyDataSetChanged() 刷新每项 item 类似,只不过 RecyclerView 还支持局部刷新notifyItemInserted(index)、
notifyItemRemoved(position)、
notifyItemChanged(position)。

在添加或删除了数据后,RecyclerView 还提供了一个默认的动画效果,来改变显示。同时,你也可以定制自己的动画效果:模仿 DefaultItemAnimator 或直接继承这个类,实现自己的动画效果,并调用recyclerview.setItemAnimator(new DefaultItemAnimator()); 设置上自己的动画。

使用 demo 可以查看:Github 【RecyclerView默认动画

LayoutManager的常用方法

  • findFirstVisibleItemPosition() 返回当前第一个可见 Item 的 position

  • findFirstCompletelyVisibleItemPosition() 返回当前第一个完全可见 Item 的 position

  • findLastVisibleItemPosition() 返回当前最后一个可见 Item 的 position

  • findLastCompletelyVisibleItemPosition() 返回当前最后一个完全可见 Item 的 position.

  • scrollBy() 滚动到某个位置。

adapter封装

其实很早之前写过一篇关于 RecyclerView 适配器的封装,所以这不再赘述了,传送门:RecyclerView的通用适配器

使用 demo 可以查看:Github 【RecyclerView通用适配器演示

吐槽

OnItemTouchListener 什么鬼?

用习惯了 ListView OnItemClickListenerRecyclerView 你的 OnItemClickListener 呢?

Tell me where do I find, something like ListView listener ?

好吧,翻遍了 API 列表,就找到了个 OnItemTouchListener ,这特么什么鬼,我干嘛要对每个 item 监听触摸屏事件。

万万没想到,最终我还是在 Google IO 里面的介绍找到了原因。原来是 Google 的工程师分不清究竟是改给 listview 的 item 添加点击事件,还是应该给每个 item 的 view 添加点击事件,索性就不给 OnItemClickListener 了,然后在 support demo 里面,你就会发现,RecyclerView 的 item 点击事件都是写在了 adapter 的 ViewHolder 里面。

当然,除了 support demo 包里面使用的在 ViewHolder 里面设置点击事件以外,我还写好了一个 RecyclerView 使用的 OnItemClickListener 代码请见:RecyclerItemClickListener.java

需要一提的是,网上有很多这种类似的 ItemClickListener ,在使用的时候一定注意一个问题,就是循环引用问题。比如 listener 里面持有了一个 recyclerview, 而这个 recyclerview 在调用 setListener() 的时候又持有了一个 listener。尽管 Java 虚拟机现在可以解决这种问题了,但作为代码编写者,这种写法还是应该尽量避免的。

divider 跑哪了?

ListView中设置 divider 非常简单,只需要在 XML 文件中设置就可以了,同时还可以设置 divider 高度。

android:divider="@android:color/black"
android:dividerHeight="2dp"

而在RecyclerView里面,想实现这两种需求,稍微复杂一点,需要自己继承RecyclerView.ItemDecoration来实现想要实现的方法。

虽说这样写灵活多了,但是要额外写一个类去做难免麻烦,这里大家可以看我已经实现好的一个封装,包括显示纯色divider显示图片dividerdivider的上下左右的间距宽高设置 应该可以满足基本需求了:Divider.java

使用 demo 可以查看:Github 【自定义 Divider 使用

LayoutManager工作原理

java.lang.Object
   ↳ android.view.View
        ↳ android.view.ViewGroup
            ↳ android.support.v7.widget.RecyclerView

首先是 RecyclerView 继承关系,可以看到,与 ListView 不同,他是一个 ViewGroup。既然是一个 View,那么就不可少的要经历 onMeasure()onLayout()onDraw() 这三个方法。

实际上,RecyclerView 就是将 onMeasure()onLayout() 交给了 LayoutManager 去处理,因此如果给 RecyclerView 设置不同的 LayoutManager 就可以达到不同的显示效果,因为onMeasure()onLayout()都不同了嘛。

ItemDecoration 工作原理

ItemDecoration 是为了显示每个 item 之间分隔样式的。它的本质实际上就是一个 Drawable。当 RecyclerView 执行到 onDraw() 方法的时候,就会调用到他的 onDraw(),这时,如果你重写了这个方法,就相当于是直接在 RecyclerView 上画了一个 Drawable 表现的东西。

而最后,在他的内部还有一个叫getItemOffsets()的方法,从字面就可以理解,他是用来偏移每个 item 视图的。当我们在每个 item 视图之间强行插入绘画了一段 Drawable,那么如果再照着原本的逻辑去绘 item 视图,就会覆盖掉 Decoration 了,所以需要getItemOffsets()这个方法,让每个 item 往后面偏移一点,不要覆盖到之前画上的分隔样式了。

ItemAnimator

每一个 item 在特定情况下都会执行的动画。说是特定情况,其实就是在视图发生改变,我们手动调用notifyxxxx()的时候。通常这个时候我们会要传一个下标,那么从这个标记开始一直到结束,所有 item 视图都会被执行一次这个动画。

Adapter工作原理

首先是适配器,适配器的作用都是类似的,用于提供每个 item 视图,并返回给 RecyclerView 作为其子布局添加到内部。

但是,与 ListView 不同的是,ListView 的适配器是直接返回一个 View,将这个 View 加入到 ListView 内部。而 RecyclerView 是返回一个 ViewHolder 并且不是直接将这个 holder 加入到视图内部,而是加入到一个缓存区域,在视图需要的时候去缓存区域找到 holder 再间接的找到 holder 包裹的 View。

ViewHolder

每个 ViewHolder 的内部是一个 View,并且 ViewHolder 必须继承自RecyclerView.ViewHolder类。
这主要是因为 RecyclerView 内部的缓存结构并不是像 ListView 那样去缓存一个 View,而是直接缓存一个 ViewHolder ,在 ViewHolder 的内部又持有了一个 View。既然是缓存一个 ViewHolder,那么当然就必须所有的 ViewHolder 都继承同一个类才能做到了。

缓存与复用的原理

还是一张截图

RecyclerView 的内部维护了一个二级缓存,滑出界面的 ViewHolder 会暂时放到 cache 结构中,而从 cache 结构中移除的 ViewHolder,则会放到一个叫做 RecycledViewPool 的循环缓存池中。

顺带一说,RecycledView 的性能并不比 ListView 要好多少,它最大的优势在于其扩展性。但是有一点,在 RecycledView 内部的这个第二级缓存池 RecycledViewPool 是可以被多个 RecyclerView 共用的,这一点比起直接缓存 View 的 ListView 就要高明了很多,但也正是因为需要被多个 RecyclerView 公用,所以我们的 ViewHolder 必须继承自同一个基类(即RecyclerView.ViewHolder)。

默认的情况下,cache 缓存 2 个 holder,RecycledViewPool 缓存 5 个 holder。对于二级缓存池中的 holder 对象,会根据 viewType 进行分类,不同类型的 viewType 之间互不影响。

源码分析


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
RecycleView是一种在Android中常用的列表控件,它允许你在列表中显示大量数据,而不会导致应用程序变得卡顿或崩溃。它使用了一个称为“回收利用”的概念,这意味着当列表不再需要时,它可以将某些元素从内存中释放出来,以节省内存空间。 以下是使用RecycleView的一些基本步骤: 1. 添加依赖项:首先,你需要在你的项目中添加一个recyclerView的依赖项。如果你使用的是Gradle构建系统,可以在build.gradle文件中添加以下代码: ```groovy dependencies { implementation 'com.android.support:recyclerview-v7:28.0.0' // 使用最新版本 } ``` 2. 创建布局文件:在你的布局文件中创建一个新的recyclerView布局文件。这个文件应该包含一个或多个用于显示数据的视图。 3. 创建适配器:适配器是连接recyclerView和数据源的关键组件。你需要创建一个适配器类,该类继承自RecyclerView.Adapter,并实现其中的一些接口方法。 4. 绑定适配器:最后,你需要将适配器绑定到recyclerView上。这通常在Activity或Fragment的onCreate方法中完成。你可以使用setAdapter方法将适配器绑定到recyclerView上。 以下是一个简单的示例代码,演示如何使用RecycleView: 1. 在布局文件中添加一个recyclerView: ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2. 在Activity或Fragment中创建一个RecyclerViewAdapter: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<String> data; // 数据源 public MyAdapter(List<String> data) { this.data = data; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_item_layout, parent, false); return new MyViewHolder(view); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.textView.setText(data.get(position)); } @Override public int getItemCount() { return data.size(); } public static class MyViewHolder extends RecyclerView.ViewHolder { private TextView textView; // 自定义视图组件 public MyViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); // 获取自定义视图组件并设置文本 } } } ``` 3. 在Activity或Fragment的onCreate方法中绑定适配器: ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); MyAdapter adapter = new MyAdapter(myData); // myData是数据源,例如一个List<String>对象 recyclerView.setAdapter(adapter); // 将适配器绑定到recyclerView上 ``` 这就是使用RecycleView的基本步骤。你可以根据需要自定义布局和适配器,以适应你的应用程序需求。RecycleView提供了许多高级功能,如自动布局、可点击边距等,可以根据需要进行配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值