很多时候我们需要在ListView中放置checkbox控件,这时候我们可能会想到用simpleAdapter,但是simpleAdapter的getChildAt()方法有个问题:当listview的数目很多时,listview需要滚动,这时候第一个选中的,最后一个也会一起选中。这是由于getChildAt()只能获取当前可视的区域的ViewGroup。因此,我们需要使用自定义的BaseAdapter.
BaseAdapter上一篇博客已经介绍过了,而这篇着重在于如何在BaseAdapter中实现完美的checkbox的单选,多选,取消功能。
首先有个问题我们需要注意一下:checkbox的点击事件优先级高于listview,因此我们需要屏蔽掉checkbox的优先级,在XML文件中编写代码如下:
android:focusable="false" //设置不获取焦点
android:clickable="false"//设置不可点击
其次,我们需要将每个checkbox的点击状态保存起来,这里使用isSelected这个HashMap<Integer,Boolean>对象来存储相应位置处的checkbox的状态.
先来看看实际的运行图:
以下为程序Activity的代码:
public class MainActivity extends Activity {
private List<Map<String,Object>> listItems;
private ListView listView;
private String[] header={"姓名","性别","电话","住址","姓名","性别","电话","住址"};
private String[] content={"张三","男","18850201111","中南海","张三","男","18850201111","中南海"};
private MyBaseAdapter adapter;
private Button allselect_bn;
private Button allcancel_bn;
private static HashMap<Integer, Boolean> isSelected=new HashMap<Integer, Boolean>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listItems=new ArrayList<Map<St