gpt4 book ai didi

java - RecyclerView : Inconsistency detected. 项目位置无效。原因 - 使用计时器删除项目

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:25 29 4
gpt4 key购买 nike

在继续之前,我在谷歌上搜索了这个错误,我发现了很多可用的答案,但我的情况与他们的情况不同。

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 2(offset:2).state:3

我正在使用 recyclerview 来显示投票问题,每个问题都有一个计时器,当计时器用完时,项目将从列表中删除。

当计时器用完时会发生异常,但只有在剩余时间较少(例如 100 毫秒)时才会出现这种情况。所以在这种情况下,可能是 recyclerview 正在膨胀项目,同时,计时器用完并且 recyclerview 尝试删除该项目。

错误是当计时器删除项目时出现异常。

因此,当该轮询剩余 1 秒或更短时间时,我在从数据集中删除元素后解决了这个问题。所以它不会在列表中添加项目,而是会运行计时器。

If you want to produce the bug just start countdown timer in bindView and once the timer runs out remove that particular item. You have to make timer below 500ms.

所以现在一切正常。解决了罕见情况下的崩溃,但我不想从数据集中删除元素,即使剩余时间更少。请给我这个错误的正确解决方案。

已编辑

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 1(offset:1).state:2 com.lsjwzh.widget.recyclerviewpager.RecyclerViewPager{182da0c VFED..... .F....ID 0,0-720,1024 #7f0a01a1 app:id/recycler_view}, adapter:com.lsjwzh.widget.recyclerviewpager.RecyclerViewPagerAdapter@c9403f, layout:android.support.v7.widget.LinearLayoutManager@6fdbd0c, context:com.bitpoll.polls.MainActivity@b40f4c0
android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5817)
android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:606)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1855)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:132)
android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1361)
android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:894)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.RelativeLayout.onLayout(RelativeLayout.java:1189)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.FrameLayout.layoutChildren(FrameLayout.java:383)
android.widget.FrameLayout.onLayout(FrameLayout.java:321)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1982)
android.widget.LinearLayout.layoutVertical(LinearLayout.java:1826)
android.widget.LinearLayout.onLayout(LinearLayout.java:1735)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.FrameLayout.layoutChildren(FrameLayout.java:383)
android.widget.FrameLayout.onLayout(FrameLayout.java:321)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1982)
android.widget.LinearLayout.layoutVertical(LinearLayout.java:1826)
android.widget.LinearLayout.onLayout(LinearLayout.java:1735)
android.view.View.layout(View.java:17969)
android.view.ViewGroup.layout(ViewGroup.java:5721)
android.widget.FrameLayout.layoutChildren(FrameLayout.java:383)
android.widget.FrameLayout.onLayout(FrameLayout.java:321)
com.android.internal.policy.DecorView.onLayout(DecorView.java:753)
android.view.View.layout(View.java:17969)

已更新

这是适配器代码。

public class PollAdapter extends RecyclerView.Adapter<PollAdapter.PollViewHolder> {

// ....

@Override
public void onBindViewHolder(@NonNull PollViewHolder holder, int position) {

// ...

if (holder.countDownTimer != null) {
holder.countDownTimer.cancel();
}

// CountDown to set Timer in poll
holder.countDownTimer = new CountDownTimer(<Timer to be finished.>, 1000) {

public void onTick(long millisUntilFinished) {
holder.time.setText("<Remaining time>");
}

public void onFinish() {
removeAt(holder.getAdapterPosition());
}

}.start();
}

@Override
public int getItemCount() {
return pollList.size();
}

// To Remove Poll after Time finished
public void removeAt(int position) {
pollList.remove(position);
notifyItemRemoved(position);
}
}

最佳答案

RecyclerViewAdapter 未收到更改通知时,会出现此错误。

要解决此错误,请查找底层 Adapter 中数据发生更改的所有点。对此没有直接的解决方案,因为这是由 引发的内部崩溃回收 View

你可以做的是:

  1. 由于您正在添加,因此在添加时调用 notifyItemInserted
  2. 并且由于您在删除时也会调用 notifyItemRemoved

要在没有任何优化的情况下进行测试,您还可以同时调用 notifyDataSetChanged

关于java - RecyclerView : Inconsistency detected. 项目位置无效。原因 - 使用计时器删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51035352/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com