Android 进阶学习(三十) RecyclerView 缓存使用技巧

image.png

相信大家基本都遇到过类似京东的评价列表的这种需求,具体的实现逻辑是RecyclerView 嵌套RecyclerView 来实现的,那么我们如何来提升他的性能呢,又如何使用最少的代码来达到我们想要的效果呢,下面我们来分析一下,

1.想要实现上面的效果,内部的RecyclerView 的LayoutManager 必须是GridLayoutManager ,我们根据数据的个数来设置spancount,从而来达到
2.外层的RecyclerView 会根据自身来缓存view 的信息,从而来提升渲染速度,难么嵌套在内部的RecyclerView 如何来缓存呢, 答案就是使用 RecyclerView.RecycledViewPool ,所有的内部RecyclerView 来共享一个RecyclerView 的第四极缓存 ,如果对换粗机制不了解的可以看一下这篇文章(RecyclerView 学习 (二) 关于RecyclerView 缓存机制 https://www.jianshu.com/p/4c6affc0c4cf ),这样就保证在内部RecyclerView 的item被回收时,会将所有item 放入到这个RecyclerView.RecycledViewPool,查看RecyclerView.RecycledViewPool 的源码我们发现 RecyclerView.RecycledViewPool是有上限的,那么我么如何来设置他的上限呢,其实可以参照 RecyclerView 自身的二级缓存,也就是2个item,这里可以看成内部RecyclerView 的2倍的最大个数 也就是6
3.想要实现2中思想在给内部RecyclerView设置属性时,需要编写大量的代码,我们如何来减少代码的书写呢

  

注意,我在编写内部RecyclerView 时,指定了他的 layoutManager 为GridLayoutManager,那么在 外部adapter的时候就可以简写为

helper?.getView(R.id.recycler_view_top_desc)?.let {
          it.setRecycledViewPool(pools)

         var layoutManager= it.layoutManager as GridLayoutManager
          layoutManager.spanCount=item?.designerTags?.size?:1

          if(it.adapter==null){
              it.adapter=DesignerStarDescAdapter(null)
          }
          
          (it.adapter as DesignerStarDescAdapter)?.apply {
              setNewData(item?.designerTags)
              setOnItemClickListener { adapter, view, position ->
                  [email protected](this@DesignerStartListAdapter,helper.itemView,helper?.adapterPosition)
              }
          }
      }

这样看起来是不是非常简单明了,而且还做到了layoutManager 的复用,不用增加额外的判断

你可能感兴趣的:(Android 进阶学习(三十) RecyclerView 缓存使用技巧)