如何 select 在回收站视图中只有一个开关?
How to select only one switch in a recycler view?
我在尝试为我的回收器适配器的每个元素添加一个开关时遇到了一个问题。
我想要实现的是一次只选择一个开关,所以每当我检查一个开关时,其他所有开关都应该自动取消选中。
这是我目前使用的回收适配器代码:
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);
}
}
}
如果有人能告诉我我做错了什么,我将不胜感激。
谢谢!
你的逻辑有点不对
你会:
if (list.get(position).get(0).equals(selected)) holder.switchButton.setChecked(true);
else holder.switchButton.setChecked(false);
这会调用您稍后设置的 checkedChange 侦听器,在第一次设置后的下一次迭代中。
移除 checkChangeListener 并改为设置点击监听器。
此外,在 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());
}
});
return vh;
}
@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();
}
我在尝试为我的回收器适配器的每个元素添加一个开关时遇到了一个问题。 我想要实现的是一次只选择一个开关,所以每当我检查一个开关时,其他所有开关都应该自动取消选中。
这是我目前使用的回收适配器代码:
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);
}
}
}
如果有人能告诉我我做错了什么,我将不胜感激。
谢谢!
你的逻辑有点不对
你会:
if (list.get(position).get(0).equals(selected)) holder.switchButton.setChecked(true);
else holder.switchButton.setChecked(false);
这会调用您稍后设置的 checkedChange 侦听器,在第一次设置后的下一次迭代中。
移除 checkChangeListener 并改为设置点击监听器。
此外,在 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());
}
});
return vh;
}
@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();
}