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()

 

 

問題四:

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