Android笔记(四):RecyclerView

本文详细介绍了RecyclerView作为ListView的增强版,提供了内置的ViewHolder重复利用机制及更清晰的结构。讲解了RecyclerView与ListView的区别,包括继承结构的不同、自带ViewHolder特性、行布局文件的加载方式变化等。此外还介绍了RecyclerView的Adapter实现细节及其与ListView Adapter的区别。

RecyclerView是ListView的增强版。有了它之后,你就可以抛弃ListView了。

recycle,重复利用。在ListView里,我们得自己写重复利用View的代码,而RecyclerView则是将此内置进去,并提供清晰的结构。

设计模式相关

RecyclerView 和 ListView 都是使用对象适配器模式。我专门为此写了一篇对适配器模式的介绍:设计模式:适配器模式

以下是该模式的UML类图(方便起见,为箭头加了说明):

809218-20170205133647229-913530529.png

对应到 RecyclerView :

类图RecyclerView
Clientandroid.support.v7.widget.RecyclerView
Targetandroid.support.v7.widget.RecyclerView.Adapter<VH extends android.support.v7.widget.RecyclerView.ViewHolder>
Adapter自己继承RecyclerView.Adapter并实现
Adaptee需要展示的List数据

这里RecyclerView的Target没有再提出接口,直接写成抽象类

远程依赖库

如果使用RecyclerView,则需要在build.gradle的dependencies里添加远程依赖库:

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

这是为了让低版本的Android系统可以用到这个RecyclerView。如果不这样,则低版本无法使用。

RecyclerView 和 ListView 有什么不同?

  • 继承结构不同:
    809218-20170205162531979-1707363011.png
  • 它自带ViewHolder。我们再也不必自己添加各种判断了。
  • 行布局文件不再由外部传入,而是在内部的onCreateViewHolder()里直接使用。
  • 添加了横向的支持,即左右滚动。这个可以用在Android TV上。
  • ……

RecyclerView的Adapter(以下称为RecyclerViewAdapter)内部需要重写的几个部分:

  • 通过构造方法获得List

    ListViewAdapter也是通过构造方法获得List,但还有另外两个参数,分别是Context和行布局的resourceId。

  • 通过onCreateViewHolder()加载布局

    ListViewAdapter在getView()里加载。

  • 通过创建内部类并继承RecyclerView.ViewHolder来获取布局里的控件

    ListViewAdapter也是创建内部类,但它是把findViewById()放到getView()里。RecyclerViewAdapter则是放在这个内部类里面。

  • 通过onBindViewHolder()给控件赋值

    Bind即绑定,意思是把数据绑定到ViewHolder上。
    ListViewAdapter把这个动作放在getView()里。

从这几个部分可以看到,本来getView()里做的三个动作,现在分到三个不同的地方。

如下图,左边是ListView的Adapter,右边是RecyclerView的Adapter:

809218-20170205160955933-1048226647.png

除此之外,RecyclerView需要在初始化它的地方给它传入LayoutManager。

如下图,左边是ListView的Activity,右边是RecyclerView的Activity:

809218-20170205161904651-1293190515.png

ListView 自带三种Adapter的实现。例如很常用的ArrayAdapter,而RecyclerView则没有这样的实现,必须自己写Adapter并重写上面所说的各个方法。

虽然RecyclerView的Adapter没有ListView的三种方便的实现,但它有三个子类:

  • ItemBridgeAdapter
  • LeanbackListPreferenceDialogFragment.AdapterMulti
  • LeanbackListPreferenceDialogFragment.AdapterSingle

这三个是给媒体设备(电视)或者游戏用的。所以如果你想要ArrayAdapter<T>SimpleAdapterSimpleCursorAdapter的效果,你得通过继承RecyclerView.Adapter来自己实现。

这里有个RecyclerView对SimpleCursorAdapter的实现:CursorRecyclerAdapter.java

效果

左边是ListView,右边是RecyclerView:

809218-20170205164345964-612607515.png

RecyclerView默认没有分割线。

如果想要分割线,可以使用默认的DividerItemDecoration:

DividerItemDecoration divider = 
        new DividerItemDecoration(recyclerView.getContext(),
        layoutManager.getOrientation());
        
recyclerView.addItemDecoration(divider);

也可以通过继承RecyclerView.ItemDecoration来自定义。

点击事件

由于每一个Item里面可能有多个视图,如果想直接点击这些视图,在ListView里实现比较麻烦。

与ListView的setOnItemClickListener()不同,RecyclerView需要在其Adapter的onCreateViewHolder()里设置点击事件。

809218-20170205171202276-328041551.png

转载于:https://www.cnblogs.com/schaepher/p/6279205.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值