在listView的适配器类外部选中的复选框

时间:2018-08-16 04:43:42

标签: android listview

在我的活动中,我有一个列表视图和一个复选框。我创建了一个适配器并对其进行了所有操作。在适配器中,我有4个复选框加载到列表视图中。

我想当用户在活动中选中此人checkBox时,会检查适配器上的所有复选框,以便首先在活动中找到复选框,最后覆盖setOnCheckedChangeListener方法。

要找出适配器中的视图数,我正在使用TmpAdp.getCount()。TmpAdp是我的实例适配器。 这是完整的代码:

   chb_allCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                for (int i = 0; i < TmpAdp.getCount(); i++) {
                    View view = Glist.getChildAt(i);
                    CheckBox ch_item = view.findViewWithTag(i);
                    // CheckBox ch_item = view.findViewById(R.id.chb_send_info); // this is not work like findViewWithTag 
                    ch_item.setChecked(true);
                }
                TmpAdp.checkAll(TmpAdp.getCount());
                TmpAdp.notifyDataSetChanged();
            } else {

            }
        }
    });

问题是,当我选中mani复选框(chb_allCheck)时,没有选中适配器内部的复选框中的所有复选框吗? 这是适配器类和getView方法的一部分:

public View getView(final int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) Tmpcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.liststyle_saveed, parent, false);

    BtnChangeToInPross = rowView.findViewById(R.id.BtnChangeToInPross);
    TextView txtNosaziCodestr = rowView.findViewById(R.id.NosaziCodestr);
    checkBox = rowView.findViewById(R.id.chb_send_info);
    checkBox.setTag(position);

enter image description here

如您所见,当我单击“主要”复选框时,没有选中适配器内部复选框中的所有复选框。

3 个答案:

答案 0 :(得分:0)

首先创建一个Model类。您将在其中使用布尔值isChecked

现在在适配器类中,您将将该模型布尔值附加到列表项复选框。

checkbox.setChecked(model.isChecked());

当您选中主复选框时。然后只需在模型列表中更改isChecked布尔值即可。

boolean isChecked = mainCheckBox.isChecked();
for(Model model : adapter.getList()){
  model.setChecked(isChecked);
}
adapter.notifyDataSetChanged();

在此处,当您更改模型的检查状态并通知您的列表时。然后,将自动检查所有复选框,因为这些复选框已附加到模型检查字段。

这是逻辑,我没有编写完整的代码,您将创建Model类,并通过列表项附加模型。

答案 1 :(得分:0)

创建一个模型类,并使用getter和setter方法来选中和取消选中Checkbox

点击“活动”中的主复选框

    chb_allCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean 
                 for (int i = 0; i < yourList.size; i++) {
                      if(checked){
                    yourlist.get(i).setCheckBoxAdapter(true);
                     }
                     else{
                    yourlist.get(i).setCheckBoxAdapter(false);
                    }
}
                   TmpAdp.notifyDataSetChanged();

            }
        });

yourAdapterClass

  @Override
    public View getView(int position, View convertView, ViewGroup parent) {
       // Get the data item for this position
       CheckBoxModelClass modelclass= getItem(position);
          if(modelclass.getCheckbox()){
            adapterCheckBox.setChecked(true);
             }
            else{
              adapterCheckBox.setChecked(false);
                   }    


            return convertView;
   }

答案 2 :(得分:-1)

与你们同舟共济,您提出了很好的建议,但让我来完善一下。

我的问题是TmpAdp.notifyDataSetChanged();。删除此代码后,代码可以正常工作。

我已经完成了代码并可以完美工作,它可以作为Select all checkbox的另一种方式。

        chb_allCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    for (int i = 0; i < TmpAdp.getCount(); i++) {
                        View view = Glist.getChildAt(i);
                        CheckBox ch_item = view.findViewById(R.id.chb_send_info);
                        ch_item.setChecked(true);
                    }
                    TmpAdp.checkAll(TmpAdp.getCount());
                } else {
                    for (int i = 0; i < TmpAdp.getCount(); i++) {
                        View view = Glist.getChildAt(i);
                        CheckBox ch_item = view.findViewById(R.id.chb_send_info);
                        ch_item.setChecked(false);
                    }
                    TmpAdp.removeAll();
                }
            }
        });