【问题标题】:java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling [duplicate]java.lang.IllegalStateException:当 RecyclerView 正在计算布局或滚动时无法调用此方法 [重复]
【发布时间】:2018-01-09 06:28:19
【问题描述】:

我正在尝试从列表视图中删除一个未启动特定文本“Dev”的项目。但是当我删除一个项目并通过 notifydatasetChanged() 刷新回收器列表时,应用程序崩溃了。这个问题已经被问过了,我已经看到了所有的解决方案,但我找不到合适的解决方案。

EvelistAdapter.java

     public class EvelistAdater extends RecyclerView.Adapter<EvelistAdater.ViewHolder> {
    Context cxt;
    ArrayList<Dbbean> adapterlist;
    int row_index;
    public EvelistAdater(Context cxt, ArrayList<Dbbean> list) {
        adapterlist=list;
        this.cxt=cxt;
        Log.d("LIst count",""+adapterlist.size());
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.scanlistadp, viewGroup, false);
        return  new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {

        if(adapterlist.get(position).blename.startsWith("Dev")) {
            holder.tv_country.setText(adapterlist.get(position).blename);

        }else{
            removeAt(position);
        }
    }

    @Override
    public int getItemCount() {
        return adapterlist.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView tv_country;
        RelativeLayout layout;
        ImageView setting;
        public ViewHolder(View view) {
            super(view);
            tv_country = (TextView)view.findViewById(R.id.tshirtname);
            setting = (ImageView) view.findViewById(R.id.setting);
            layout = (RelativeLayout)view.findViewById(R.id.layout);
        }
    }
    public void removeAt(int position) {
        adapterlist.remove(position);
        notifyDataSetChanged();
    }
}

LOGCAT

E/UncaughtException: java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
                                                                        at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2586)
                                                                        at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeChanged(RecyclerView.java:4951)
                                                                        at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeChanged(RecyclerView.java:11371)
                                                                        at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeChanged(RecyclerView.java:11362)
                                                                        at android.support.v7.widget.RecyclerView$Adapter.notifyItemChanged(RecyclerView.java:6650)
                                                                        at com.scanner.com.eve.EvelistAdater.removeAt(EvelistAdater.java:94)
                                                                        at com.scanner.com.eve.EvelistAdater.onBindViewHolder(EvelistAdater.java:44)
                                                                        at com.scanner.com.eve.EvelistAdater.onBindViewHolder(EvelistAdater.java:19)
                                                                        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6354)
                                                                        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6387)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5343)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5606)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5448)
                                                                        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5444)
                                                                        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224)
                                                                        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551)
                                                                        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
                                                                        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
                                                                        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3600)
                                                                        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3329)
                                                                        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3867)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                                        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                                        at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                                        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                                        at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:636)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                                                                        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                                                                        at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                                                                        at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                                                                        at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2895)
                                                                        at android.view.View.layout(View.java:16655)
                                                                        at android.view.ViewGroup.layout(ViewGroup.java:5438)
                                                                        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171)
                                                                        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1931)
                                                                        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
                                                                        at android.view.ViewR

【问题讨论】:

  • 一开始用不同的名字this.list=list;和分享logcat
  • 你必须从onBindViewHolder()中删除notifyDataSetChanged()
  • @IntelliJAmiya 问题已使用 logcat 更新
  • @Sekhar 同意#Heisen-Berg 的评论

标签: android android-recyclerview


【解决方案1】:

在传递给Adapter之前过滤list中的数据

 ArrayList<Dbbean> list = yourlist; 

创建过滤的list

  ArrayList<Dbbean> filteredList = new ArrayList<>();
  for(Dbbean dbean : list){
    if(dbean.blename.startsWith("Dev")
     filteredList.add(dbean);
  }

将过滤后的列表传递给适配器

EvelistAdapter adapter = new EvelistAdaptr(this,filteredList);
yourRecyclerView.setAdapter(adapter);

【讨论】:

  • 谢谢,Rajan 它正在工作,但我得到了两次相同的名字,如何在一个列表中删除相同的名字?
  • 只检查重复的名称条目。
【解决方案2】:

不要在onBindViewHolder 内直接调用removeItem。如果您想删除项目,请在设置适配器之前执行此操作。

首先将过滤后的ArrayList&lt;Dbbean&gt; list 提供给adpater。稍后您可以在任何指定的操作上从适配器中删除项目。
在您不确定更改了哪个数据集之前,请勿使用notifyDataSetChanged()。采用 : notifyItemRemoved() 用于删除位置的特定项目。

【讨论】:

    【解决方案3】:

    这导致了你只是强行更改 onBindViewHolder 的问题,它现在再次绘制一些东西以重绘。

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
    
        if(adapterlist.get(position).blename.startsWith("Dev")) {
            holder.tv_country.setText(adapterlist.get(position).blename);
    
        }else{
            removeAt(position);
        }
    }
    
    public void removeAt(int position) {
        adapterlist.remove(position);
        notifyDataSetChanged();
    }
    

    建议更好地检查此条件并在您即将从片段或活动通知适配器时删除项目。

    【讨论】:

    • 谢谢 Vikas,你是对的,现在我正在使用 Rajan 的解决方案及其工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多