📜  如何在 Android RecyclerView 中选择单个 RadioButton?(1)

📅  最后修改于: 2023-12-03 15:24:06.069000             🧑  作者: Mango

如何在 Android RecyclerView 中选择单个 RadioButton?

在 Android RecyclerView 中选择单个 RadioButton 可能是一个常见且棘手的问题。下面介绍两种实现方式。

实现方式一:使用 RecyclerView.Adapter 中的位置来跟踪 RadioButton

在 RecyclerView 的 Adapter 中,我们可以使用位置(position)变量来跟踪我们想要选择的 RadioButton。我们可以在 onBindViewHolder() 方法中设置 RadioButton 的状态,并在 RecyclerView 的滚动中,通过调用 notifyItemChanged() 方法来更新状态。

以下是代码实现:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private int lastSelectedPosition = -1;

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ...// ViewHolder 的创建
    }

    @Override
    public void onBindViewHolder(MyAdapter.ViewHolder holder, final int position) {
        holder.radioButton.setChecked(lastSelectedPosition == position);
        holder.radioButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                lastSelectedPosition = position;
                notifyDataSetChanged();
            }
        });
    }

    @Override
    public int getItemCount() {
        ...// 返回列表项数量
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        RadioButton radioButton;

        ViewHolder(View itemView) {
            super(itemView);
            radioButton = (RadioButton) itemView.findViewById(R.id.radioButton);
        }
    }
}

在上面的代码中,我们使用 lastSelectedPosition 变量来跟踪我们最后选择的位置。在 onBindViewHolder() 方法中,我们检查当前位置是否等于 lastSelectedPosition,如果是,则设置 RadioButton 为选中状态。我们还为 RadioButton 添加了一个单击侦听器,以便在单击时更新 lastSelectedPosition 和 RecyclerView 的状态。请注意,定义的 ViewHolder 类需要将 RadioButton 变量作为成员变量。

实现方式二:使用数据集来跟踪 RadioButton

我们可以将单选列表中每个项目中 RadioButton 的状态保存在数据集中,当单击 RadioButton 时更新数据集并刷新 RecyclerView。

下面是代码实现:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<Item> items;

    MyAdapter(List<Item> items) {
        this.items = items;
    }

    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ...// ViewHolder 的创建
    }

    @Override
    public void onBindViewHolder(MyAdapter.ViewHolder holder, final int position) {
        holder.radioButton.setChecked(items.get(position).isSelected());
        holder.radioButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                uncheckAllRadios();
                items.get(position).setSelected(true);
                notifyDataSetChanged();
            }
        });
    }

    @Override
    public int getItemCount() {
        ...// 返回列表项数量
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        RadioButton radioButton;

        ViewHolder(View itemView) {
            super(itemView);
            radioButton = (RadioButton) itemView.findViewById(R.id.radioButton);
        }
    }

    private void uncheckAllRadios() {
        for (Item item : items) {
            item.setSelected(false);
        }
    }

    public static class Item {
        private boolean isSelected;

        Item(boolean isSelected) {
            this.isSelected = isSelected;
        }

        boolean isSelected() {
            return isSelected;
        }

        void setSelected(boolean selected) {
            isSelected = selected;
        }
    }
}

在上面的代码中,我们定义了一个 Item 类来描述 RecyclerView 中的项目及其状态。在 onBindViewHolder() 方法中,我们检查当前 Item 对象的 isSelected 属性是否为 true,并相应地设置 RadioButton 的相应状态。我们还为 RadioButton 添加了一个单击侦听器,以便在单击时反转 isSelected 属性并更新 RecyclerView 的状态。

最后,我们定义了一个 uncheckAllRadios() 方法来反转 items 列表中所有 Item 对象的 isSelected 属性。