如果取消选中listview复选框,请取消选中SelectAll Checkbox

时间:2017-02-17 08:58:02

标签: android listview android-checkbox

我有一个带复选框的自定义列表视图。在主要布局中有"全选"复选框。如果我选择"全选"复选框然后选中所有复选框。我想要的是当我取消选中任何一个列表视图复选框时,"全选"复选框也必须取消选中。我尝试了如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;
&#13;
&#13;

2 个答案:

答案 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。

希望这能解决您的问题。