当前位置:   article > 正文

RecyclerView学习笔记_findchildviewunder获取的view不对

findchildviewunder获取的view不对

自学习android以来,其实一直都有接触到 RecyclerView,今天便总结一下关于RecyclerView的相关知识,并不是非常全面。主要从以下几个方面:

  1. RecyclerView概述
  2. RecyclerView与ListView区别
  3. RecyclerView基本使用
  4. RecyclerView item单击与长按事件
  5. RecyclerView item长按拖拽和侧滑删除

源码地址:https://github.com/Ti2Yuan/RecyclerViewDemo


1. RecyclerView概述

2014年Google IO的召开,Android L Preview版发布,对于开发者而言,它带来了性能上的改善。其中,一个全新的控件也进入开发者的视野中,并得到越来越多的使用,大有取代ListView的趋势,它就是RecyclerView。

    A flexible view for providing a limited window into a large data set.        
  • 1

上面那句话是官网中对RecyclerView的描述:能在有限的窗口中显示大数据集的灵活视图。
RecyclerView是Google support-v7包下新增的控件,用来替代ListView的使用,RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓存。但是它却是ListView的增强版。


2.RecyclerView与ListView区别

正如官方文档所言,RecyclerView是ListView的豪华增强版。它主要包含以下几处新的特性,如ViewHolder,ItemDecorator,LayoutManager,SmoothScroller以及增加或删除item时item动画等。官方推荐我们采用RecyclerView来取代ListView。

ViewHolder
ViewHolder是用来保存视图引用的类,在ListView中,ViewHolder需要自己来定义,但只是一种推荐的使用方式,不是必须要使用的。取而代之的是ListView性能的迟缓,因为ListView每次getView的时候都会调用findViewById(int)方法。而在RecyclerView中则强调必须使用RecyclerView.ViewHolder,否则代码将不能运行。虽然这个过程实现起来稍显复杂,但是却避免了ListView不使用ViewHolder而带来的性能问题。

LayoutManager
ListView只能在垂直方向上滚动,google并没有给出ListView在水平方向上面滚动的Android API支持。但是RecyclerView相较于ListView,在滚动上可以支持多种类型列表,例如:

LinearLayoutManager,可以支持水平和竖直方向上滚动的列表。

StaggeredGridLayoutManager,可以支持交叉网格风格的列表,类似于瀑布流或者Pinterest。

GridLayoutManager,支持网格展示,可以水平或者竖直滚动,如展示图片的画廊。

ItemAnimator
列表动画是一个全新的、拥有无限可能的维度。起初的Android API中,删除或添加item时,item是无法产生动画效果的。后面随着Android的进化,Google的Chat Hasse推荐使用ViewPropertyAnimator属性动画来实现上述需求。
RecyclerView.ItemAnimator用于在RecyclerView中添加、删除或移动item时处理动画效果。同时也存在一个默认的动画效果DefaultItemAnimator。而ListView则不具备这种API。

Adapter
在ListView的Adapter中,getView方法将视图跟position绑定在一起。同时我们能通过registerDataObserver在Adapter中注册一个观察者。在RecyclerView中,我们也可以通过RecyclerView.AdapterDataObserver观察。ListView有三个Adapter的默认实现,分别是ArrayAdapter、CursorAdapter和SimpleCursorAdapter。然而,RecyclerView的Adapter则拥有除了内置的内DB游标和ArrayList的支持之外的所有功能。RecyclerView.Adapter的实现中,我们必须采取措施将数据提供给Adapter。

ItemDecoration
在ListView中我们可以通过divider和dividerHeight这些相关属性为item添加间隔符。但是在RecyclerView中可通过RecyclerView.ItemDecoration类来实现自定义间隔符。默认情况下item之间不会展示间隔符。这的确增加了开发人员的负担,如果你想要添加间隔符的话。你还可以参考官方示例中的DividerItemDecoration.java文件。

OnItemTouchListener
ListView通过AdapterView.OnItemClickListener接口来探测点击事件。而RecyclerView则可以通过RecyclerView.OnItemTouchListener接口来探测触摸事件。这种探测方式虽然增加了实现的难度,但是却给予开发人员拦截触摸事件更多的控制权限。

还有就是ListView可以添加MultiChoiceModeListener来设置选择模式,但是RecyclerView却没有。

总结:
recyclerView自定义强,可以实现复杂的布局,但过程稍显复杂。


3.RecyclerView基本使用

首先,在moudle下的build.gradle导入包

dependencies {
    compile 'com.android.support:recyclerview-v7:23.2.0'
}
  • 1
  • 2
  • 3

然后在布局中

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recycleView"
        android:layout_margin="10dp"
        android:scrollbars="vertical"/>`
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

然后就是为RecyclerView设置LayoutManager,Adapter,ItemAnimator和ItemDecoration。而自定义的RecyclerViewAdapter中必须继承RecyclerView.Adapter,并且实现需要重写的方法,如onCreateViewHolder,onBindViewHolder,getItemCount()等等。并且可通过getItemViewType(int position)方法返回item 类型,可用于返回headItem和FootItem类型。

recyclerView =(RecyclerView)findViewById(R.id.recycleView);
mLayoutManager = new LinearLayoutManager(this);
adapter = new RecyclerViewAdapter(this<
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/286666
推荐阅读
相关标签
  

闽ICP备14008679号