我在尝试向回收器适配器的每个元素添加开关时遇到了一个问题。我想要实现的是一次只选择一个开关,所以每当我检查一个开关时,其他开关都应该自动取消选中。
这是我当前使用的回收器适配器代码:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {
private final DomainAdapter DA = DomainAdapter.getInstance();
private final ArrayList<ArrayList<String>> list;
private String selected;
public RecyclerAdapter(ArrayList<ArrayList<String>> list, String selected) {
this.list = list;
this.selected = selected;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.list_element, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if (list.get(position).get(0).equals(selected)) holder.switchButton.setChecked(true);
else holder.switchButton.setChecked(false);
holder.switchButton.setOnCheckedChangeListener((toggleButton, isChecked) -> {
if (isChecked) {
try {
DA.select(list.get(position).get(0));
} catch (NoSuchMethodException ignore) {}
}
else {
}
});
}
@Override
public int getItemCount() {
return list.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
Switch switchButton;
public ViewHolder(@NonNull View itemView) {
super(itemView);
switchButton = itemView.findViewById(R.id.switchButton);
}
}
}
如果有人能告诉我我做错了什么,我会非常感激的。
谢谢您!
1条答案
按热度按时间xcitsw881#
你的逻辑有点不正确。
您需要:
这将调用checkedchange监听器,您稍后将在第一次设置行之后的下一次迭代中设置该监听器。
删除checkchangelistener并改为设置click listener。
另外,在
onCreateViewHolder
而不是在onBindViewHolder
```@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.list_element, parent, false);
ViewHolder vh = new ViewHolder(view);
vh.switchButton.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View view) {
setItemSelected(vh.getAdapterPosition());
}
});
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position)
{
boolean isSelected = list.get(position).get(0).equals(selected);
holder.switchButton.setChecked(isSelected);
}
private void setItemSelected(int position) {
DA.select(list.get(position).get(0));
selected = list.get(position).get(0);
notifyDataSetChanged();
}