如何在Android中禁用RecyclerView项目?

4

在Recyclerview中有Textviews和Checkboxes。最初所有的复选框都是被选中的。我想防止用户改变复选框的状态,但我不想阻止Recyclerview滚动。我希望在我的片段类中实现这个功能,而不是在适配器类中。

如何防止用户改变复选框的状态?

以下是在适配器类的onBindViewHolder中编写的示例代码。

holder.cbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            //set your object's last status
            tblFilm.setSelected(isChecked);
        }
    });

以上代码用于第一种模式,允许用户单击复选框。

之后我有第二种模式,在这种模式下我不希望复选框被单击。

为此,我做了以下工作。

optionsoff(recyclerView);
private static void optionsOff(ViewGroup layout) {
        layout.setEnabled(false);
        layout.setClickable(false);
        for (int i = 0; i < layout.getChildCount(); i++) {
            View child = layout.getChildAt(i);
            if (child instanceof ViewGroup) {
                optionsOff((ViewGroup) child);
            } else {
                child.setEnabled(false);
                child.setClickable(false);
            }
        }

我猜测这个optionsoff()不起作用了,因为它没有禁用复选框。我仍然可以点击复选框。我需要帮助解决第二种方法,即禁用Recyclerview项目。

1
你目前做了什么? - Saurabh Vardani
目前RecyclerView显示了20个项目,这些项目是电影名称,并且所有相关的复选框默认都被选中。我想防止用户点击复选框。 - user6154174
在您的布局中将其(复选框)设置为android:clickable="false"。 - Saurabh Vardani
@saurabhgupta 请查看我的更新问题。 - user6154174
2个回答

4
每个 CheckBox 都有一个名为 setEnabled 的方法。
onBindViewHolder 方法中,您可以获取所需的 checkBox 的引用并将其禁用。
代码示例:
public void onBindViewHolder(ViewHolder holder, final int position) {
    holder.checkBox.setEnabled(data.get(position).isEnabled());
}

下面的答案也是通过xml实现的可行解决方案。

谢谢您的回复,但我想在我的片段类中完成这个而不是在适配器类中。 - user6154174
1
@ShameemPayyanur 看起来你不理解它的工作原理。Fragment 是一个具有生命周期的大视图容器。Adapter 是一种将数据和列表表示之间桥接的东西。你只能通过 xml(如另一个答案)或使用我的方法来更改所有项的启用状态。 - Anton Shkurenko

1
也许可以尝试这样做?
<CheckBox
        android:id="@+id/server_is_online"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checked="true"
        android:clickable="false"
        android:text="@string/server_is_online"
        android:textSize="23sp" />

如果您的适配器(继承自BaseAdapter)需要编程添加内容,您可以这样做

public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.rowbuttonlayout, null);
            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
        } else {
            view = convertView;
            ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
        }
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.checkbox.setChecked(true);
        holder.checkbox.setEnabled(false);
}

这是一个好的继承自BaseAdapter的类的例子,在这里


我想要以编程的方式实现。 - user6154174

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