包含复选框的Recyclerview项目会被扭曲

时间:2017-05-18 12:47:30

标签: android android-recyclerview android-checkbox

我有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,这不是主意。

1 个答案:

答案 0 :(得分:0)

为什么不使用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);
        }
    });