Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在活动中从弹出菜单中选择“回收器”视图的复选框?_Java_Android_Android Activity_Checkbox_Android Recyclerview - Fatal编程技术网

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
vs
contactArrayList
,工具栏
mTitle
,它甚至不是成员(?)。选择一个并坚持使用。

您的回收器适配器由
contactList=contactDb.getAllContacts()支持类别
联系人
。我建议在类中添加像
isSelected
这样的属性,默认为
false
。单击“全选”遍历整个联系人列表后,将所有
isSelected
设置为
true
。现在,您只需在适配器上调用
notifyDatasetChanged
(可能notifyItemRange已随负载更改,因此您不必重新绑定所有保持器)

onBindViewHolder
中,您要根据
isSelected
属性选中复选框


代码风格:不要混合使用匈牙利符号,也不要随意使用。它使一切都更难阅读
mContext
vs
contactArrayList
,工具栏
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
案例(因为循环使用)