【问题标题】:How to select check boxes of recycler view from a pop menu in an activity?如何从活动的弹出菜单中选择回收站视图的复选框?
【发布时间】:2017-02-11 04:44:34
【问题描述】:

我有一个带有复选框的联系人列表。此外,我还必须在工具栏上创建一个单击图像的弹出菜单。

弹出菜单显示全选选项。

所以单击全选我希望列表的所有复选框都被选中。

我在适配器中定义的复选框。

适配器:

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

}

活动:

    public class InviteContactsActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private InviteAdapter adapter;
    private ArrayList<Contact> contactList;
    private ContactTableHelper contactDb;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_invite_contacts);


        Toolbar toolbar = (Toolbar) findViewById(R.id.main_toolbar);
        TextView mTitle = (TextView) findViewById(R.id.toolbar_title);

        mTitle.setText("Invite Contacts");


        if (toolbar != null) {

            toolbar.setTitle("");
            setSupportActionBar(toolbar);

        }
        ImageView back = (ImageView)findViewById(R.id.imageBack);

        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                finish();

            }
        });

        final ImageView selectAll = (ImageView)findViewById(R.id.selectAll);

        selectAll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                PopupMenu popup = new PopupMenu(InviteContactsActivity.this,selectAll);

                popup.getMenuInflater().inflate(R.menu.pop_up_menu, popup.getMenu());

                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {



                        return true;
                    }
                });

                popup.show();
            }
        });


        contactDb = new ContactTableHelper(InviteContactsActivity.this);

        contactList = contactDb.getAllContacts();

        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(InviteContactsActivity.this);
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
        recyclerView.setItemAnimator(new DefaultItemAnimator());

        adapter = new InviteAdapter(InviteContactsActivity.this, contactList);
        recyclerView.setAdapter(adapter);
    }
}

谢谢你..

编辑:

我是这样做的:

活动中:

            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                public boolean onMenuItemClick(MenuItem item) {

                    for (Contact contact: mContactList) {

                        contact.setSelected(true);


                    }

                    mAdapter.notifyItemRangeChanged(); // how to do here?

                    return true;
                }
            });

在适配器中:

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

}

请检查并告诉我我错过了什么?

【问题讨论】:

    标签: java android android-activity checkbox android-recyclerview


    【解决方案1】:

    首先,您需要为复选框实现一个数据模型并将其设为假。所以默认情况下复选框将被取消选中。

    当您打开一个弹出窗口并单击 checkall 选项时,更改模型类的值并使其为真并通知适配器,您将得到结果。

    ModelClass.java

    public class ModelClass implements Serializable {
        public Boolean isChecked;
    
        public Boolean getChecked() {
           return isChecked:
        }
    
        public void setChecked(Boolean checked) {
          isChecked = checked;
        }
    
    }
    

    最初,使用setCheked() 方法设置isChecke = false 的值,因此您可以检索isChecked 的值并使用getChecked() 方法获取值,您可以访问适配器类中的值。

    现在,当您打开弹出菜单时,只需使用setCheck() 方法和isChecked = true 的setValue,然后通知适配器。就是这样

    【讨论】:

      【解决方案2】:

      在你的适配器类中创建一个方法:

      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
      

      这里是 Recycler 适配器中涉及的方法及其使用说明的链接:

      https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html

      【讨论】:

        【解决方案3】:

        您的回收器适配器由 Contact 类的 contactList = contactDb.getAllContacts(); 提供支持。我建议在类中添加像isSelected 这样的属性,默认为false。点击“全选”后遍历整个联系人列表,将所有isSelected设置为true。现在你只需要在你的适配器上调用notifyDatasetChanged(可能用有效负载通知ItemRangeChanged,这样你就不必重新绑定所有持有者)。

        onBindViewHolder 中,您要选中基于isSelected 属性选中的复选框。

        代码风格:不要混合使用匈牙利符号,不要随意使用。它使一切变得更难阅读。 mContext vs contactArrayList,工具栏mTitle 甚至不是成员(?)。选择一个并坚持下去。

        【讨论】:

        • 我可以知道如何使用有效负载调用 notifyItemRangeChanged 吗?有效载荷的概念是什么? @poss
        • 我只获得了 notifyAll 的选项并在 recyclerview 上通知。 @poss
        • 您不要在 recyclerView 上调用 notify,而是在适配器上调用它。有效负载在文档中的描述比我做的更好,但是简短的版本通知您的适配器支持它们的对象没有改变,只有一些属性发生了变化(比如您的复选框)。您现在不必为此烦恼, notifyDatasetChanged 应该可以正常工作。另外,在您的适配器中,当您执行if(contact.getSelected() == true) 时,您必须制作一个else 案例(因为回收)
        猜你喜欢
        • 2018-04-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2020-03-30
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        相关资源
        最近更新 更多