SmartRefreshLayout java.lang.IndexOutOfBoundsException

holgip5t  于 2个月前  发布在  Java
关注(0)|答案(2)|浏览(92)

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)

tp5buhyn

tp5buhyn2#

这是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);

相关问题