簡體   English   中英

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM