美文网首页
RecyclerView的优化处理

RecyclerView的优化处理

作者: 周大侠侠侠侠侠侠侠侠侠侠侠侠侠 | 来源:发表于2019-07-22 16:52 被阅读0次

    一句话思路 空间换取时间 使用内存空间换取数据转化的时间

    推荐使用BaseRecyclerViewAdapterHelper
    1. 一般来说,都是在自定义的adapter中进行数据负值操作,为了方便,一些简单的逻辑处理也放在了adapter中。这样导致的问题是,在Item复用的过程中,这些逻辑操作会执行多次。
    一般示例:
    helper.setText(R.id.tvTime,TimeUtils.millis2String(timestamp))
    
    优化示例:
    data class Data(val timestamp:Long){
        val formatTime:String by lazy { TimeUtils.millis2String(timestamp) }
    }
        
    helper.setText(R.id.tvTime,data.formatTime)     
    
    

    在上面的代码中,在实体类中设置了一个懒加载数据formatTime,用一个参数来存放格式化后的日期数据,这样在一条item中就只会执行一次日期格式化逻辑,之后直接取值

    1. RecyclerView会新增和删除数据
    一般示例:
    mData.addAll(list)
    adapter.notifyDataSetChanged()
    
    优化示例:
    adapter.addData(list)
    

    分别表示刷新整体列表的数据,和只刷新新增数据,前者必定会造成页面闪烁,除非数据整体刷新不然不要使用

    1. 布局优化,尽量减少布局嵌套,和尽可能少的控件,复杂控件可以使用自定义View的形式,在ItemView中使用ConstraintLayout的表现并不是很好,暂时不推荐,不知道以后会不会更改

    2. 对于一些RecyclerView嵌套RecyclerView的布局,比如外层列表,内部一个标题头跟着条目列表,可以使用多布局进行展示,而不是使用嵌套

    3. xml文件读取,如果需要创建View或者读取一些x,可以使用代码进行创建,这里的xml文件不仅包括layout的xml,还包括drawable的xml,xml文件inflate出ItemView是通过耗时的IO操作

    4. 如果RecyclerView的ItemView的高度固定,使用setHasFixedSize(true),避免多次测量条目的高度

    5. 对于RecyclerView,如果没有要求使用条目展示动画,那么可以把条目动画取消

    ((SimpleItemAnimator)mRvList.getItemAnimator()).setSupportsChangeAnimations(false);
    
    1. 对于一个页面一个Tab配合多个RecyclerView的,并且RecyclerView使用同一个Adapter,那么可以使用setRecycledViewPool(pool),共用回收池,避免来每一个RecyclerView都创建一个回收池,特别是RecyclerView嵌套RecyclerView时候,内部的RecyclerView必定使用的都是同一个Adapter,这个时候就很有必要使用回收池

    2. 视情况,使用setItemViewCacheSize(size)来加大RecyclerView缓存数目,用空间换取时间提高流畅度

    3. 对于条目点击时间不要在复用部分进行setOnClickListener,这样会重复设置点击监听,而是应该创建 <u>一个</u> listener接口,传入控件的id,和当前的条目position,通过id和position判断处理点击监听

    4. 视情况,可以对RecyclerView添加滑动监听,在快速滑动的时候取消图片加载,在缓慢滑动或者停止的时候开启图片加载,配合图片加载框架Glide picasso等

    5. 视情况,图片加载可以使用Glide的preload()预加载或其他图片框架预加载,在展示图片的时候就不用重新加载图片了,直接从缓存中获取

    6. 重写LayoutManager的getExtraLayoutSpace()方法,可以返回屏幕高度,用于增加RecyclerView预留的额外空间

    7. setInitialItemPrefetchCount(),在下一个条目还没有出现的时候,下一条目还没有被创建,绑定布局和屏幕渲染,然而之前的条目都已经完成了,下一个条目还没有出现,这个时候就会有一大段的时间,那么把这一部分的利用起来,将下一个条目的创建和绑定过程先进行执行,等下一个条目出现时,只需要渲染就好了。

    相关文章

      网友评论

          本文标题:RecyclerView的优化处理

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