首页 > 解决方案 > 如何在 RecyclerView 的所有项目中显示此复选框?

问题描述

我想在回收站视图的所有项目中显示所有复选框。当我长按它们时。我会告诉你我想在这张图片中做什么。

在此处输入图像描述

在此处输入图像描述

当我长按其他文件夹中的图片文件夹时,将出现一个空复选框,然后我们可以选择它们并为它们做我们想做的事情。最后,当我单击项目并发生这种情况时,我该怎么做。

这是我的适配器。

public class NoteAdapter extends Adapter<NoteAdapter.MyView> {
List<Note> notes;
Activity activity1;


public NoteAdapter(List<Note> noteList, Activity activity) {
    activity1 = activity;
    notes = noteList;
}

@NonNull
@Override
public NoteAdapter.MyView onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_note, parent, false);
    return new MyView(itemView);
}

@Override
public void onBindViewHolder(@NonNull final NoteAdapter.MyView holder, final int position) {
    holder.note.setText(notes.get(position).note);
    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            holder.checkbox.setVisibility(View.VISIBLE);
            //the code at the line up just set visible the selected item but i want to set visible all items check boxs
            return false;
        }
    });
}

@Override
public int getItemCount() {
    return notes.size();
}

public class MyView extends RecyclerView.ViewHolder {
    private TextView name;
    private CheckBox checkBox;

    public MyView(@NonNull View itemView) {
        super(itemView);
        note = itemView.findViewById(R.id.note);
        chackbox = itemView.findViewById(R.id.chackBox);
    }
}

}

标签: javaandroidandroid-recyclerview

解决方案


你可以试试这个:

public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.MyView> {
List< Note > notes;
Activity activity1;
ArrayList<Integer> checkedList = new ArrayList<>();
RecyclerView recyclerView;

//.....

@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
    this.recyclerView = recyclerView;
}

@Override
public void onBindViewHolder(@NonNull final NoteAdapter.MyView holder, final int position) {
    holder.name.setText(notes.get(position).note);
    holder.checkBox.setVisibility(checkedList.size() > 0 ? View.VISIBLE : View.GONE);
    holder.checkBox.setChecked(checkedList.contains(position));

}

//......

public class MyView extends RecyclerView.ViewHolder {
    private TextView name;
    private CheckBox checkBox;

    public MyView(@NonNull View itemView) {
        super(itemView);
        name = itemView.findViewById(R.id.name);
        checkBox = itemView.findViewById(R.id.checkBox);

        itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                if(checkedList.contains(getAdapterPosition())){
                    checkedList.remove(Integer.valueOf(getAdapterPosition()));
                    if (checkedList.size() == 0){
                        notifyDataSetChanged();
                    }else {
                        notifyItemChanged(getAdapterPosition());
                    }
                }else {
                    checkedList.add(getAdapterPosition());
                    if (checkedList.size() == 1){
                        recyclerView.post(new Runnable()
                        {
                            @Override
                            public void run() {
                                notifyDataSetChanged();
                            }
                        });
                    }else {
                        notifyItemChanged(getAdapterPosition());
                    }

                }
                //the code at the line up just set visible the selected item but i want to set visible all items check boxs
                return false;
            }
        });
        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                if(b){
                    if(!checkedList.contains(getAdapterPosition()))
                        checkedList.add(getAdapterPosition());
                }else{
                    checkedList.remove(Integer.valueOf(getAdapterPosition()));
                    if (checkedList.size() == 0){
                        recyclerView.post(new Runnable()
                        {
                            @Override
                            public void run() {
                                notifyDataSetChanged();
                            }
                        });
                    }
                }
            }
        });
    }
  }
}

我在 MyView 中添加了长按方法并进行了一些更改。它工作更稳定。onBind方法中存在位置错误。

onAttachedToRecyclerView:有时notifyDataSetChanged()方法会出错。我添加了能够使用 recyclerView


推荐阅读