📅  最后修改于: 2023-12-03 15:24:06.069000             🧑  作者: Mango
在 Android RecyclerView 中选择单个 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 时更新数据集并刷新 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 属性。