RecyclerView踩坑笔记

问题一.RecyclerView中嵌套另外一个RecyclerView时,内部的RecyclerView滑动时状态是不会变化的。

原因:

解决方案:获取父级的RecyclerView进行判断。

 

问题二:发现onCreateViewHolder频繁被调用,从而导致卡顿。

原因:页面刷新较为频繁。 所以每次notifyDataSetChanged提示刷新的时候,会回收掉所有已经展示的ViewHolder,然后重新渲染,RecyclerView默认的缓存数量是5个。这时候,如果当前展示的数量超过5个,比如8个。那么就会有3个ViewHolder找到可复用的对象,从而走onCreateViewHolder的流程,初始化View的操作是十分耗时的,而且是主线程,从而导致卡顿。

解决方案:如果刷新确实比较频繁的话,则按照当前页面估算能展示多少个ViewHolder,扩大复用的数值,比如我就把ViewHolder的复用数量改为了10。

itemView.rv_list.recycledViewPool.setMaxRecycledViews(0, 10)

 

问题三:java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder

原因:滑动的过程中,如果依赖的list的数量发生变化,则就会抛出这样的错误。

解决方案:

1.确保adapter依赖独立的数据源。这个意思就是说adapter独占一个recycleList,而进行操作的是另外一个dataList。当需要刷新时,在主线程中,清空recycleList,把数据源dataList加到recycleList中。并且立即调用notifyDataSetChanged进行刷新。

示例如下:

functionItemAdapter?.recyclerList?.clear()
functionItemAdapter?.recyclerList?.addAll(mDataList)
functionItemAdapter?.notifyDataSetChanged()

 

 

问题四:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章