我有一个带复选框的自定义列表视图。在主要布局中有"全选"复选框。如果我选择"全选"复选框然后选中所有复选框。我想要的是当我取消选中任何一个列表视图复选框时,"全选"复选框也必须取消选中。我尝试了如here所示,但它不起作用。如果我取消选中任何列表视图复选框,则所有列表视图复选框都将被取消选中。
public class ContactsListAdapter extends BaseAdapter {
Context ctx;
LayoutInflater lInflater;
ArrayList<Contacts> objects;
CheckBox _selectall;
ContactsListAdapter(Context context, ArrayList<Contacts> products, CheckBox selectall) {
ctx = context;
objects = products;
lInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
_selectall=selectall;
}
@Override
public int getCount() {
return objects.size();
}
@Override
public Object getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.contact_item, parent, false);
}
//final Contacts p = getProduct(position);
Contacts contacts = objects.get(position);
((TextView) view.findViewById(R.id.tvName)).setText(contacts.getName());
((TextView) view.findViewById(R.id.tvMobile)).setText(contacts.getMobile());
((TextView) view.findViewById(R.id.tvEmail)).setText(contacts.getEmail());
final CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
cbBuy.setTag(position);
cbBuy.setChecked(contacts.box);
if(_selectall.isChecked()){
_selectall.setChecked(true);
}else{
_selectall.setChecked(false);
}
cbBuy.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
getProduct((Integer) buttonView.getTag()).box = isChecked;
if(_selectall.isChecked()){
_selectall.setChecked(true);
}else{
_selectall.setChecked(false);
}
notifyDataSetChanged();
}
});
_selectall.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(_selectall.isChecked()){
for(int i=0; i<objects.size();i++){
getProduct(i).box = true;
cbBuy.setTag(i);
cbBuy.setChecked(objects.get(i).box);
}
}else{
for(int i=0; i<objects.size();i++){
getProduct(i).box = false;
cbBuy.setTag(i);
cbBuy.setChecked(objects.get(i).box);
}
}
notifyDataSetChanged();
}
});
return view;
}
Contacts getProduct(int position) {
return ((Contacts) getItem(position));
}
ArrayList<Contacts> getBox() {
ArrayList<Contacts> box = new ArrayList<Contacts>();
for (Contacts p : objects) {
if (p.box)
box.add(p);
}
return box;
}
}
&#13;
答案 0 :(得分:1)
在checkedChangedListener上检查总检查项目。如果它等于您的总项目,则selectAll复选框将为true,否则为false。详细示例为here
答案 1 :(得分:0)
我相信您的全选复选框不在您的列表组件中。 您现在不需要将地图维护为维护。
将您的逻辑移动到SelectAll setOnCheckedChangeListener put 来自适配器的getView()。它只会打电话 notifyDatasetChanged(),不是一行多于此。
首先,你需要确定一下 setOnCheckedChangeListener for selectAll调用notifyDatasetChanged for 列表视图,因此所有列表复选框组件都会被修改。
在listview的getView方法中,只需在设置复选框时添加检查 对于单个项目,即if(selectAll.isChecked())然后标记这个 复选框为setSelected(true),否则为false。
setOnCheckedChangeListener上最后一个特定列表项 复选框添加与上面相同的检查,即if(selectAll.isChecked()) 但只需将SelectAllCheckbox设置为false。
希望这能解决您的问题。