适配器包:
/**
* 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>