带有复选框的回收器视图项目会失真



我有一个RecyclerView物品,它们都有一个checkbox。关键是你只能将一个checkbox设置为checked(类似于收藏夹(。一切正常,直到有足够的项目需要滚动RecyclerView。但是,当有足够的项目可以滚动时,该项目的某些名称就会消失,除了一个之外,checkboxes都不起作用,并且全部卡住了。另外,我得到以下异常:

"Cannot call this method while RecyclerView is computing a layout or scrolling"

这就是我正在做的:

holder.getBinder().cbIsFavourite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (mListener == null) {
                return;
            }
            if (isChecked) {
                for (Peem peemTmp : mPeemList) {
                    if (peemTmp.isFavourite()) {
                        peemTmp.setFavourite(false);
                    }
                }
                peem.setFavourite(true);
                PeemAdapter.this.notifyDataSetChanged();
            } else {
                peem.setFavourite(false);
                removeFavouriteShops(peem);
            }
            mListener.onFavouriteChecked(peem);
        }
    });

错误发生在此行PeemAdapter.this.notifyDataSetChanged();如果我删除该行,一切都没问题,但是可以选择多个checkboxes,这不是这个想法。

为什么不使用 RadioButton 和 RadioGroup ?

否则尝试在 Runnable 帖子中调用 notifyDataSetChanged((,它将在布局计算后调用。像这样:

myView.post(new Runnable() {
      @Override
      public void run() {
            notifyDataSetChanged();
       }
     });

编辑:

holder.getBinder().cbIsFavourite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (mListener == null) {
                return;
            }
            if (isChecked) {
                for (Peem peemTmp : mPeemList) {
                    if (peemTmp.isFavourite()) {
                        peemTmp.setFavourite(false);
                    }
                }
                peem.setFavourite(true);
                holder.getBinder().cbIsFavourite.post(new Runnable() {
                @Override
                public void run() {
                   PeemAdapter.this.notifyDataSetChanged();
                   }
              });
            } else {
                peem.setFavourite(false);
                removeFavouriteShops(peem);
            }
            mListener.onFavouriteChecked(peem);
        }
    });

相关内容

最新更新