禁用RecyclerView中的项目(Android)

5

我的 RecyclerView 是一个带有复选框的列表,页面底部有一个提交按钮。当我点击按钮时,复选框应该被禁用,但已经选中的复选框状态应该保留。另外,如何访问复选框,因为它在 RecyclerView.ViewHolder 中?请帮忙。

4个回答

3

最好将此作为您正在建模的项目的属性。

因此,如果模型项目将具有可以更改的“启用”状态。

public class Model {

   private boolean isEnabled;
   private boolean isChecked;

   public void setEnabled(boolean enabled) { 
      isEnabled = enabled;
   }

   public void setChecked(boolean checked) {
      isChecked = checked;
   }

   public boolean isEnabled() {
      return isEnabled;
   }

   public boolean isChecked() {
      return isChecked;
   }
}

然后你的ViewHolder将在每次绑定时检查此属性。此外,ViewHolder本身将监听它处理的视图上复选框的更改。

public class ModelViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckChangeListener {
   private CheckBox checkBox;
   private Model boundItem;

   public ModelViewHolder(View itemView) {
       checkBox = (CheckBox) itemView.findItemById(R.id.checkBoxId);
       checkBox.setOnCheckChangeListener(this);
   }

   public void bind(Model model) {
       boundItem = model;
       getItemView().setEnabled(model.isEnabled());
       checkBox.setChecked(model.isChecked());
   }

   @Override
   public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
       boundItem.setChecked(isChecked);
   }
}

现在,这样做的好处是当用户滚动时,项目的状态将保持一致(因为RecyclerItem中的视图被重复使用)。此外,它还可以让你更容易地在启用/禁用模型项时使用notifyItemChanged(int position)来更新项目。

有没有办法在片段类中访问ViewHolder的复选框? - fmpsagara
从技术上讲,是的,但你为什么想这样做呢?复选框并不像值那样重要。 - DeeV
重要的是要知道视图(复选框)是临时的。屏幕上只有可见的这么多(加上一两个)。如果你有一百个项目,那么可能只有10个复选框。如果你想知道第99项的值,你将无法取得它。 - DeeV
我想的是,每当我点击提交按钮时,列表上的复选框应该有点变灰,但已经选中的框应该保留它们的状态。 - fmpsagara
当您单击“提交”按钮时,请在每个模型项上调用setEnabled(false)。然后在适配器上调用notifyDataSetChanged(),以便重新绑定所有的ViewHolder。复选框将保留其状态。 - DeeV

2

您需要在传递给适配器的列表中获取您的项。如果它是一个自定义适配器,您可以制作一个方法来返回您的列表,并编写以下代码:

mAdapter.getList().get(4).setEnabled(false); //or equivalent
mAdapter.notifyDataSetChanged(); //or mRecycler.getAdapter().notifyDataSetChanged()

2

将Recyclerview的背景颜色更改为灰色。在Recyclerview中,仅当执行某些操作时才禁用工作。如果尝试禁用但未执行任何操作,则会出现空指针异常


-3
你可以尝试这样做:
   RecyclerView rv=new RecyclerView(context);
   rv.getChildAt(5).setEnabled(false); // disables the 6th element

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接