Java 如何在活动中从弹出菜单中选择“回收器”视图的复选框?
我有一个带有复选框的联系人列表。此外,我还必须创建一个弹出式菜单,点击工具栏上的图像 弹出菜单显示全选选项 所以,单击“全选”,我希望列表中的所有复选框都被选中 我在适配器中定义的复选框 适配器:Java 如何在活动中从弹出菜单中选择“回收器”视图的复选框?,java,android,android-activity,checkbox,android-recyclerview,Java,Android,Android Activity,Checkbox,Android Recyclerview,我有一个带有复选框的联系人列表。此外,我还必须创建一个弹出式菜单,点击工具栏上的图像 弹出菜单显示全选选项 所以,单击“全选”,我希望列表中的所有复选框都被选中 我在适配器中定义的复选框 适配器: public class InviteAdapter extends RecyclerView.Adapter<InviteAdapter.MyViewHolder> { private ArrayList<Contact> contactArrayList;
public class InviteAdapter extends RecyclerView.Adapter<InviteAdapter.MyViewHolder> {
private ArrayList<Contact> contactArrayList;
private Context mContext;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView name;
private CheckBox checkBox;
public MyViewHolder(View view) {
super(view);
name = (TextView) view.findViewById(R.id.textContactName);
checkBox = (CheckBox) view.findViewById(R.id.checkBox);
}
}
public InviteAdapter(Context context, ArrayList<Contact> contactArrayList) {
this.contactArrayList = contactArrayList;
this.mContext = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.invite_contact_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Contact contact = contactArrayList.get(position);
holder.name.setText(contact.getmFullName());
}
@Override
public int getItemCount() {
return contactArrayList.size();
}
}
在适配器中:
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Contact contact = contactArrayList.get(position);
holder.name.setText(contact.getmFullName());
if(contact.getSelected() == true)
{
holder.checkBox.setChecked(true);
}
}
请检查并让我知道我缺少什么?您的回收器适配器由
contactList=contactDb.getAllContacts()支持代码>类别联系人
。我建议在类中添加像isSelected
这样的属性,默认为false
。单击“全选”遍历整个联系人列表后,将所有isSelected
设置为true
。现在,您只需在适配器上调用notifyDatasetChanged
(可能notifyItemRange已随负载更改,因此您不必重新绑定所有保持器)
在onBindViewHolder
中,您要根据isSelected
属性选中复选框
代码风格:不要混合使用匈牙利符号,也不要随意使用。它使一切都更难阅读mContext
vscontactArrayList
,工具栏mTitle
,它甚至不是成员(?)。选择一个并坚持使用。您的回收器适配器由contactList=contactDb.getAllContacts()支持代码>类别联系人
。我建议在类中添加像isSelected
这样的属性,默认为false
。单击“全选”遍历整个联系人列表后,将所有isSelected
设置为true
。现在,您只需在适配器上调用notifyDatasetChanged
(可能notifyItemRange已随负载更改,因此您不必重新绑定所有保持器)
在onBindViewHolder
中,您要根据isSelected
属性选中复选框
代码风格:不要混合使用匈牙利符号,也不要随意使用。它使一切都更难阅读mContext
vscontactArrayList
,工具栏mTitle
,它甚至不是成员(?)。首先,您需要为复选框实现一个数据模型,并将其设为false。因此,默认情况下,复选框将处于未选中状态
当您打开一个弹出窗口并单击checkall选项时,更改模型类的值并使其为真,并通知适配器,您将得到结果
ModelClass.java
public class ModelClass implements Serializable {
public Boolean isChecked;
public Boolean getChecked() {
return isChecked:
}
public void setChecked(Boolean checked) {
isChecked = checked;
}
}
最初,使用setchecked()
method设置isChecke=false的值,这样您就可以检索isChecked的值,并使用getChecked()
方法获取值,并且可以访问适配器类中的值
现在,当您打开弹出菜单时,只需使用setCheck()
方法和isChecked=true的setValue,然后通知适配器。就是这样首先,您需要为checkbox实现一个数据模型,并将其设为false。因此,默认情况下,复选框将处于未选中状态
当您打开一个弹出窗口并单击checkall选项时,更改模型类的值并使其为真,并通知适配器,您将得到结果
ModelClass.java
public class ModelClass implements Serializable {
public Boolean isChecked;
public Boolean getChecked() {
return isChecked:
}
public void setChecked(Boolean checked) {
isChecked = checked;
}
}
最初,使用setchecked()
method设置isChecke=false的值,这样您就可以检索isChecked的值,并使用getChecked()
方法获取值,并且可以访问适配器类中的值
现在,当您打开弹出菜单时,只需使用setCheck()
方法和isChecked=true的setValue,然后通知适配器。就是这样在适配器类中创建一个方法:
public void toggleContactsSelection( boolean isSelected ) {
for( Contact contact : contactArrayList ) {
contact.setSelected(isSelected);
}
notifyDataSetChanged(); // OR you can use notifyItemRangeChanged - which ever suits your needs
}
在onBindViewHolder方法中:
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Contact contact = contactArrayList.get(position);
holder.name.setText(contact.getmFullName());
holder.checkBox.setChecked(contact.getSelected());
}
需要选择全部/取消选择所有联系人时,请调用适配器的方法:
inviteAdapter.toggleContactsSelection(true); //Selects all contacts
inviteAdapter.toggleContactsSelection(false); //Unselect all contacts
以下链接指向回收器适配器中涉及的方法及其使用说明:
在适配器类中创建一个方法:
public void toggleContactsSelection( boolean isSelected ) {
for( Contact contact : contactArrayList ) {
contact.setSelected(isSelected);
}
notifyDataSetChanged(); // OR you can use notifyItemRangeChanged - which ever suits your needs
}
在onBindViewHolder方法中:
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Contact contact = contactArrayList.get(position);
holder.name.setText(contact.getmFullName());
holder.checkBox.setChecked(contact.getSelected());
}
需要选择全部/取消选择所有联系人时,请调用适配器的方法:
inviteAdapter.toggleContactsSelection(true); //Selects all contacts
inviteAdapter.toggleContactsSelection(false); //Unselect all contacts
以下链接指向回收器适配器中涉及的方法及其使用说明:
我可以知道如何使用有效负载调用notifyItemRangeChanged吗?有效载荷的概念是什么@可能我只能选择notifyAll和recyclerview上的notify@如果不在recyclerView上调用notify,则在adapter上调用它。文档中对有效负载的描述比我所能做的要好,但简短的版本是通知您的适配器,支持它们的对象并没有改变,只有一些属性改变了(比如您的复选框)。您现在不必为此烦恼,notifyDatasetChanged应该可以正常工作。另外,在适配器中,当您执行if(contact.getSelected()==true)
时,您必须执行否则
情况(因为循环),我可以知道如何调用notifyItemRangeChanged with payload吗?有效载荷的概念是什么@可能我只能选择notifyAll和recyclerview上的notify@如果不在recyclerView上调用notify,则在adapter上调用它。文档中对有效负载的描述比我所能做的要好,但简短的版本是通知您的适配器,支持它们的对象并没有改变,只有一些属性改变了(比如您的复选框)。您现在不必为此烦恼,notifyDatasetChanged应该可以正常工作。另外,在适配器中,当您执行if(contact.getSelected()==true)
时,您必须创建一个else
案例(因为循环使用)