美文网首页
Android中RecyclerView异常总结

Android中RecyclerView异常总结

作者: 王魔王 | 来源:发表于2018-11-21 14:12 被阅读0次

本篇帖子用于记录在开发过程中有关recyclerView的错误总结,会慢慢更新...
1.非法状态异常

 java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling android.support.v7.widget.RecyclerView{a767943 VFED..... .F....ID 0,0-1080,1594 #7f07006c app:id/recyclerShopcart}, adapter:com.bawie.bawaymall160a.shopcart.adapter.ShopcartRecyclerAdapter@a363bc0, layout:android.support.v7.widget.LinearLayoutManager@5cc20f9, context:com.bawie.bawaymall160a.shopcart.activity.ShopcartActivity@6408c0
        at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2880)
        at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:5281)
        at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:11997)
        at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:7070)
        at com.bawie.bawaymall160a.shopcart.adapter.ShopcartRecyclerAdapter$MyViewHodler$1.onCheckedChanged(ShopcartRecyclerAdapter.java:134)
        at android.widget.CompoundButton.setChecked(CompoundButton.java:156)
        at com.bawie.bawaymall160a.shopcart.adapter.ShopcartRecyclerAdapter.onBindViewHolder(ShopcartRecyclerAdapter.java:63)
        at com.bawie.bawaymall160a.shopcart.adapter.ShopcartRecyclerAdapter.onBindViewHolder(ShopcartRecyclerAdapter.java:24)
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)

关键词:Cannot call this method while RecyclerView is computing a layout or scrolling
大概意思是说无法调用这个方法当recyclerView正在计算布局或者滚动的时候。
这个异常通常是在我们在动态更新recyclerView的布局的时候出现,常常伴随这样的代码

class MyViewHodler extends RecyclerView.ViewHolder {
        TextView tvShopName;
        RecyclerView recyclerGoods;
        CheckBox checkBox;
        public MyViewHodler(@NonNull View itemView) {
            super(itemView);
            tvShopName = itemView.findViewById(R.id.tvShopName);
            recyclerGoods = itemView.findViewById(R.id.recyclerGoods);
            checkBox = itemView.findViewById(R.id.checkbox);
            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                     //各种处理数据的代码
                    //处理完数据去更新recyclerView,此时会报上述异常
                    notifyDataSetChanged();
                }
            });
        }
    }

解决方案:

class MyViewHodler extends RecyclerView.ViewHolder {
        TextView tvShopName;
        RecyclerView recyclerGoods;
        CheckBox checkBox;
        public MyViewHodler(@NonNull View itemView) {
            super(itemView);
            tvShopName = itemView.findViewById(R.id.tvShopName);
            recyclerGoods = itemView.findViewById(R.id.recyclerGoods);
            checkBox = itemView.findViewById(R.id.checkbox);
            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                     //各种处理数据的代码
                    //更新数据的时候使用handler
                    new Handler().post(new Runnable() {
                        @Override
                        public void run() {
                            notifyDataSetChanged();
                        }
                    });
                }
            });
        }
    }

相关文章

网友评论

      本文标题:Android中RecyclerView异常总结

      本文链接:https://www.haomeiwen.com/subject/lcfcqqtx.html