美文网首页Android开发积累Android专题
Android基础(13)RecyclerView详解

Android基础(13)RecyclerView详解

作者: perry_Fan | 来源:发表于2019-02-20 21:38 被阅读168次

    1)RecyclerView原理
    2)ListView重用的是什么?和RecyclerView有什么区别
    3)实现MultiType的方式 (getItemType并关联 onCreateViewHolder、onBindViewHolder)
    4)ListView 中图片错位的问题是如何产生的? (未能正确使用convertView)
    5)RecyclerView和ListView的性能对比

    RecyclerView与ListView对比 缓存机制浅析

    ListView两级缓存 RecyclerView四级缓存

    ListView和RecyclerView

    1. 缓存机制基本一致:
      1) mActiveViews和 mAttachedScrap 功能相似,意义在于快速重用屏幕上可见的列表项ItemView,而不需要重新createView和bindView;
      2)mScrapView和 mCachedViews + mReyclerViewPool 功能相似,意义在于缓存离开屏幕的ItemView,目的是让即将进入屏幕的ItemView重用;
      3)RecyclerView的优势在于:
      a. mCacheViews的使用,可以做到屏幕外的列表项ItemView进入屏幕内时也无须bindView快速重用;
      b. mRecyclerPool可以供多个 RecyclerView 共同使用,在特定场景下,如ViewPager + 多个列表页下有优势。客观来说,RecyclerView在特定场景下对ListView的缓存机制做了补强和完善。

    2. 缓存内容不同:
      1)RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:
      View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);


      RecyclerView

    2)ListView缓存View


    ListView

    RecyclerView的缓存机制确实更加完善,但还不算质的变化,RecyclerView更大的亮点在于提供了局部刷新的接口,通过局部刷新,就能避免调用许多无用的bindView。
    结合RecyclerView的缓存机制,看看局部刷新是如何实现的:
    以RecyclerView中notifyItemRemoved(1)为例,最终会调用requestLayout(),使整个RecyclerView重新绘制,过程为:

            onMeasure() → onLayout() → onDraw()
    

    其中,onLayout()为重点,分为三步:

    1. dispathLayoutStep1():记录RecyclerView刷新前列表项ItemView的各种信息,如Top,Left,Bottom,Right,用于动画的相关计算;
    2. dispathLayoutStep2():真正测量布局大小,位置,核心函数为layoutChildren();
    3. dispathLayoutStep3():计算布局前后各个ItemView的状态,如Remove,Add,Move,Update等,如有必要执行相应的动画。

    当调用notifyItemRemoved时,会对屏幕内ItemView做预处理,修改ItemView相应的pos以及flag(流程图中红色部分):



    当调用fill()中RecyclerView.getViewForPosition(pos)时,RecyclerView通过对pos和flag的预处理,使得bindview只调用一次。

    需要指出,ListView 和 RecyclerView最大的区别在于数据源改变时的缓存的处理逻辑,ListView是”一锅端”,将所有的mActiveViews都移入了二级缓存mScrapViews,而RecyclerView则是更加灵活地对每个View修改标志位,区分是否重新bindView。

    相关文章

      网友评论

        本文标题:Android基础(13)RecyclerView详解

        本文链接:https://www.haomeiwen.com/subject/xdsmeqtx.html