scwang90 / SmartRefreshLayout

🔥下拉刷新、上拉加载、二级刷新、淘宝二楼、RefreshLayout、OverScroll,Android智能下拉刷新框架,支持越界回弹、越界拖动,具有极强的扩展性,集成了几十种炫酷的Header和 Footer。
https://segmentfault.com/a/1190000010066071
Apache License 2.0
24.8k stars 4.94k forks source link

java.lang.IndexOutOfBoundsException #1433

Open langxing opened 2 years ago

langxing commented 2 years ago

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionUserEmptyHolder{7dfa329 position=20 id=-1, oldPos=0, pLpos:0 scrap [attachedScrap] tmpDetached no parent} androidx.recyclerview.widget.RecyclerView{31294dc VFED..... ......I. 0,0-1080,1656 #7f09087c app:id/recyclerView}, adapter:com.benfu.yiqi.index.mvp.ui.adapter.IndexUserNearAdapter@66c99e5, layout:androidx.recyclerview.widget.LinearLayoutManager@f3f7cba, context:com.benfu.yiqi.mvp.ui.activity.MainActivity@49fe2d at androidx.recyclerview.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:6156) at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6339) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6300) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6296) at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330) at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1631) at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:4255) at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4010) at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4578) at android.view.View.layout(View.java:22344) at android.view.ViewGroup.layout(ViewGroup.java:6445) at com.scwang.smart.refresh.layout.SmartRefreshLayout.onLayout(SmartRefreshLayout.java:649)

zhaobinsir commented 1 year ago

+1

xiongbb commented 1 week ago

这是RecyclerView的报错。数据列表与recyclerView的view holder不一致导致报错。 比如有代码: list.clear(); ... list.addAll(newList) 解决方法1: int size = list.size(); ... list.clear(); adapter.notifyItemRangeRemoved(0, size); ... list.addAll(newList) adpater.notifyitemRangeChanged(0, list.size())

也可以使用一个adpater.notifyDataSetChanged(); 但是这个不被推荐。 解决方法2: 捕获异常 public class LinearLayoutManagerWrapper extends LinearLayoutManager { @Override public void onLayoutChildren(RecyclerView recycler, RecyclerView.State state) { try { super.onLayoutChildren(recycler, state) } catch (IndexOutOfBoundsException e) { // do something... } } } 使用该LinearLayoutMangerWrapper的包装类 rv.layoutManager = LinearLayoutManagerWrapper(this);