IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder
2873 ワード
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewholder異常処理
一般的にこのようなエラーを報告するには2つの状況があります.
1つ目:listデータソースが変化してadapterがタイムリーにリフレッシュされなかった、すなわちタイムリーnotifyDataSetChanged()
2つ目:次の場合のrecycleViewで偶発的にエラーが発生し、次の場合は2つ目のエラーの解決策です.
具体的にはどの行の間違いを報告していませんが、最終的にはgoogle大神が修復しなければなりません.
一時的な解決策:LinearLayoutManagerWrapper継承LinearLayoutManagerを作成し、onLayoutChildrenメソッドを書き換え、例外処理を追加すればよい
次にrecycleViewでこのレイアウトを設定すればいいです.他のレイアウトスタイルは似ています.
転載するhttp://blog.csdn.net/zhangyiacm/article/details/78287655ああ、自分で記録して
一般的にこのようなエラーを報告するには2つの状況があります.
1つ目:listデータソースが変化してadapterがタイムリーにリフレッシュされなかった、すなわちタイムリーnotifyDataSetChanged()
2つ目:次の場合のrecycleViewで偶発的にエラーが発生し、次の場合は2つ目のエラーの解決策です.
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{35b7b5f position=12 id=-1, oldPos=-1, pLpos:-1 no parent}
at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5251)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5433)
at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:270)
at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:324)
at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:337)
at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:344)
at android.support.v7.widget.GapWorker.run(GapWorker.java:370)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:185)
at android.app.ActivityThread.main(ActivityThread.java:6493)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:916)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:806)
具体的にはどの行の間違いを報告していませんが、最終的にはgoogle大神が修復しなければなりません.
一時的な解決策:LinearLayoutManagerWrapper継承LinearLayoutManagerを作成し、onLayoutChildrenメソッドを書き換え、例外処理を追加すればよい
public class WrapContentLinearLayoutManager extends LinearLayoutManager {
public WrapContentLinearLayoutManager(Context context) {
super(context);
}
public WrapContentLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
public WrapContentLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
// , , ,
try {
super.onLayoutChildren(recycler, state);
} catch (IndexOutOfBoundsException e) {
e.printStackTrace();
}
}
}
次にrecycleViewでこのレイアウトを設定すればいいです.他のレイアウトスタイルは似ています.
mRecyclerView.setLayoutManager(new WrapContentLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
転載するhttp://blog.csdn.net/zhangyiacm/article/details/78287655ああ、自分で記録して