全选与反选_购物车

适配器包:


/**
 * Created by 天空蓝依旧 on 2016/10/8.
 */
public class CheckAdapter extends BaseAdapter
{

    private List<String> list;
    private Context context;
    private CheckBox cbAll,cbReverse;

    //定义一个集合主要是为了listview的每条item中的checkbox赋值
    LinkedList<Boolean> linkedList=new LinkedList<Boolean>();
    public CheckAdapter(List<String> list, Context context, CheckBox cbAll, CheckBox cbReverse)
    {
        this.list = list;
        this.context = context;
        this.cbAll = cbAll;
        this.cbReverse = cbReverse;

        for(int i=0;i<list.size();i++)
        {
            //设置该集合中的元素都为false;
            linkedList.add(false);
        }

    }

    public List<Boolean> getSelect()
    {
        return linkedList;
    }

    public int getCount()
    {
        return list.size();
    }

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int i, View view, ViewGroup viewGroup)
    {
        ViewHolder vh;
        if(view==null)
        {
            vh=new ViewHolder();
            view=View.inflate(context, R.layout.list_item,null);

            vh.cbItem= (CheckBox) view.findViewById(R.id.cb_item);
            vh.tvItem= (TextView) view.findViewById(R.id.tv_item);

            view.setTag(vh);
        }else
        {
            vh= (ViewHolder) view.getTag();
        }

        vh.tvItem.setText(list.get(i));
        //默认情况下设置每个checkbox为未选中状态
        vh.cbItem.setChecked(linkedList.get(i));

        //这里的CheckBox监听之所以不设置为setOnCheckedChangeListener主要是当上下拉item时有时CheckBox未选中状态下会自动选中,避免Bug产生所以用setOnClikListener
        vh.cbItem.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {

                //每当点击一次CheckBox把他的值改变为相反的默认的值,比如,所有的ListView中的CheckBox默认为false,当点击一下时就会变为true
                linkedList.set(i,!linkedList.get(i));


                for(int i=0;i<linkedList.size();i++)
                {

                    //不要表达成!linkedList.contains(true),这句的意思是每个checkbox都为选中是不正确的,可能一部分未选中,一部分选中,也可能
                    //全部都为true所以跟我们判断的所有的checkbox都为false条件不匹配,属于语句错误
                    if(linkedList.contains(false))
                    {
                        cbAll.setChecked(false);
                    }else
                    {
                        cbAll.setChecked(true);
                    }
                }

                //每次进行数据变更的时候不要忘记进行数据刷新
                notifyDataSetChanged();


            }
        });

        return view;
    }

    class ViewHolder
    {
        CheckBox cbItem;
        TextView tvItem;
    }
}


生气MainActivity



 private ListView listview;
    private CheckBox cbAll,cbReverse;
    private List<String> list;
    private  CheckAdapter checkAdapter;

    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化数据源
        initDatas();

        //控件初始化
        initView();
    }

    private void initView()
    {
        //找到listView控件
        listview=(ListView) findViewById(R.id.listview);
        //找到全选控件
        cbAll=(CheckBox) findViewById(R.id.cb_all);
        //找到反选按钮
        cbReverse= (CheckBox) findViewById(R.id.cb_reverse);


        //得到适配器
        checkAdapter=new CheckAdapter(list,MainActivity.this,cbAll,cbReverse);


        //为ListView添加适配器
        listview.setAdapter(checkAdapter);

        //全选按钮的监听
        cbAll.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                //当点击全选时,要保证listview中的每一个item条目checkbox都为true,即每个都是选中状态
                //判断的长度一定要是linkedlist<Boolean>中的长度,全完不能搞混,弄成list.size(),值相同但原理不同

                //由于选中所有的checkbox或者点击全选按钮,两者都能同步,所以应定义一个共同的值即可
                boolean flag=cbAll.isChecked();
                for(int i=0;i<checkAdapter.getSelect().size();i++)
                {
                    checkAdapter.getSelect().set(i,flag);
                }

//                //同理,如果所有的checkbox都为选中状态,那么全选的状态也为选中状态,即为true
//                if(checkAdapter.getSelect().contains(true))
//                {
//                     cbAll.setChecked(true);
//                }

                checkAdapter.notifyDataSetChanged();

            }
        });

        //反选按钮的监听
        cbReverse.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View view)
            {
                //判断所有的checkbox都为false时,那么Toast一下至少选择一项
                if(!checkAdapter.getSelect().contains(true))
                {
                    Toast.makeText(MainActivity.this,"请选择至少一项",Toast.LENGTH_SHORT).show();
                }else
                {

                    //实现效果,每点一次反选,选中的checkbox,全部变为未选中的,同理,未选中(false)的下次全部变为选中的(true)
                    //循环遍历判断每个checkbox的状态,如果是true,那么将其值设为相反的
                   for(int i=0;i<checkAdapter.getSelect().size();i++)
                   {
                        if(checkAdapter.getSelect().get(i))
                        {
                            checkAdapter.getSelect().set(i,false);
                        }else
                        {
                            checkAdapter.getSelect().set(i,true);
                        }
                   }

                    //如果点击反选前每个checkbox都为未选中状态,那么点击后将全部变为选中状态,相应的全选也为选中状态
                    if(checkAdapter.getSelect().contains(false))
                    {
                        cbAll.setChecked(true);
                    }

                    //数据刷新
                    checkAdapter.notifyDataSetChanged();


                }

            }
        });




    }

    private void initDatas()
    {
        //初始化的主要是listview每个条目中的文字信息
        list=new ArrayList<String>();

        for(int i=0;i<15;i++)
        {
            list.add("开心元气+"+i);
        }

    }

}



大笑Layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.bwie.text.MainActivity">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listview"
        android:layout_above="@+id/linear"
        />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/linear"
        android:orientation="horizontal"
        android:weightSum="2"
        >

        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/cb_all"
            android:text="全选"
        android:layout_weight="1"
            />

        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/cb_reverse"
            android:text="反选"
            android:layout_weight="1"
            />
    </LinearLayout>
</LinearLayout>



















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值