我的活动中有一个RecyclerView,我想向RecyclerView中添加多个选择,这是我的适配器:

public class RingtoneItemAdabter extends RecyclerView.Adapter<RingtoneItemAdabter.ViewHolder> {

    private Context context;
    private Activity activity;
    private List<RingtoneItem> list;
    private boolean selectionMode = false;
    private List<RingtoneItem> selectedItems = new ArrayList<>();

    public class ViewHolder extends RecyclerView.ViewHolder {

        public Switch aSwitch;
        public TextView textView;
        public View view;
        public CheckBox checkBox;

        public ViewHolder(View view) {
            super(view);
            this.view = view;
            aSwitch = (Switch) view.findViewById(R.id.ringtone_state_switch);
            textView = (TextView) view.findViewById(R.id.ringtone_title_textview);
            checkBox = (CheckBox) view.findViewById(R.id.selection_checkbox);
        }
    }

    public RingtoneItemAdabter(Context context, Activity activity, List<RingtoneItem> list) {
        this.context = context;
        this.activity = activity;
        this.list = list;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.recyclerview_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        final RingtoneItem item = list.get(position);

        holder.checkBox.setVisibility(selectionMode ? View.VISIBLE : View.GONE);
        holder.textView.setText(item.getTitle());
        holder.aSwitch.setChecked(item.isActive());
        holder.textView.setTextColor(item.isActive() ? Color.BLACK : Color.GRAY);
        holder.aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    holder.textView.setTextColor(Color.BLACK);
                    item.setActive(true);
                    writeToFile();
                } else {
                    holder.textView.setTextColor(Color.GRAY);
                    item.setActive(false);
                    writeToFile();
                }
            }
        });
        holder.view.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if(selectionMode){
                    return false;
                }else {
                    startSelecting();
                    holder.checkBox.setChecked(true);
                    return true;
                }
            }
        });
        holder.view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(selectionMode){
                    holder.checkBox.setChecked(!holder.checkBox.isChecked());
                }
            }
        });
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    selectedItems.add(item);
                }else {
                    selectedItems.remove(item);
                }
                if(selectedItems.size() == 0){
                    stopSelecting();
                }
            }
        });
    }

    @Override
    public int getItemCount() { ... }

    private void writeToFile() { ... }

    private void startSelecting(){
        selectionMode = true;
        notifyDataSetChanged();
    }

    private void stopSelecting(){
        selectionMode = false;
        notifyDataSetChanged();
    }
}


这是recyclerview_item中的复选框标签:

    <CheckBox
        android:id="@+id/selection_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="4dp"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


所以我希望startSelection方法在每个项目中显示复选框,而stopSelection方法在每个项目中隐藏复选框。

编辑:

看来我遇到了问题,问题是当我单击并按住某个项目时,将出现复选框,并且必须选中我长期单击的项目的复选框,如果我未选中每个复选框,则复选框应消失,这是应用程序的工作方式,但是当我尝试使用它时,它不起作用,当我长时间单击某个项目时,该复选框会出现,在某些情况下,另一个复选框会被选中,但在另一些情况下,其中一个复选框都不会被选中,何时我取消选中每个复选框,这些复选框保留在那里。
我有一个关于为什么复选框没有消失的想法,例如,如果我长按了第四项,则将显示复选框,而不是应该被选中的第四项,而不是第一个被选中的项,而是第四项是将添加到selectedItems列表中的那个,因此,如果我未选中第一个框,则不会发生任何事情,因为它没有存储在列表中,但是如果我选中了第四项,则另一个第四项将添加到列表中,并且如果我未选中它将删除第四项的两个副本之一,但将保留其中一个。
检查上面的代码。

我知道我的解释很不好,我的英语也不太好,但是希望您能理解:)

最佳答案

为显示/隐藏复选框状态定义一个布尔变量,并在onBindViewHolder中设置与该变量相关的复选框的可见性

boolean showCheckboxes = false;

public void startSelection() {
    showCheckboxes = true;
    notifyDataSetChanged();
}

public void stopSelection() {
    showCheckboxes = false;
    notifyDataSetChanged();
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    final RingtoneItem item = list.get(position);

    holder.checkBox.setVisibility(showCheckboxes ? View.VISIBLE: View.GONE);

    /*
    ...
    */
}

10-01 06:26
查看更多