【问题标题】:How to show this check box in all items of RecyclerView? [duplicate]如何在 RecyclerView 的所有项目中显示此复选框? [复制]
【发布时间】:2020-09-03 13:15:18
【问题描述】:

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

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

这是我的适配器。

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

}

【问题讨论】:

  • 将图片添加到您的问题中,而不是作为链接,同时添加适配器代码。
  • 只需在您的适配器中添加 onLongClick!
  • 我知道如何添加 onLongClick,但我无法为所有项目设置可见的所有复选框

标签: java android android-recyclerview


【解决方案1】:

你可以试试这个:

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

【讨论】:

  • 首先谢谢你 allVisible = !allvisible ;然后我想选中那个位置的复选框,我长按了,但是这项工作我只是让它们可见。
  • 查看我发送的第二张图片,当我长按图片文件夹时,所有复选框都变得可见并且图片复选框也被选中。
  • 我编辑了我的答案。你可以这样做。
  • 是的,它不起作用我现在测试它,当我长按第三个项目时,它们都变得可见并且第一个项目将检查。当我长按第六个项目时,第四个位置的项目会检查我不知道为什么会发生这种情况。
  • 我尝试了不同的方法。你能试试这个吗?这样,您就选择了复选框列表。
猜你喜欢
  • 2020-06-23
  • 2018-04-23
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多