如何在回收器视图中只选择一个开关?

lmyy7pcs  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(248)

我在尝试向回收器适配器的每个元素添加开关时遇到了一个问题。我想要实现的是一次只选择一个开关,所以每当我检查一个开关时,其他开关都应该自动取消选中。
这是我当前使用的回收器适配器代码:

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);
        }
    }

}

如果有人能告诉我我做错了什么,我会非常感激的。
谢谢您!

xcitsw88

xcitsw881#

你的逻辑有点不正确。
您需要:

if (list.get(position).get(0).equals(selected)) holder.switchButton.setChecked(true);
    else holder.switchButton.setChecked(false);

这将调用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());
}
});

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();
}

相关问题