在我的活动中,我有一个列表视图和一个复选框。我创建了一个适配器并对其进行了所有操作。在适配器中,我有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);
如您所见,当我单击“主要”复选框时,没有选中适配器内部复选框中的所有复选框。
答案 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();
}
}
});