android开发经常会遇到ListView中含有checkBox和Button的情况,这里主要会有三个问题,下面分别论述:
1. ListView中含有checkBox或者Button时,listView的item无法响应点击事件,这主要是因为checkBox和Button等获取焦点的能力高于listView,此时应该让其子控件不能获取焦点,即在布局文件中设置子控件属性android:focusable="false"或者在listView的adapter的布局中加入android:descendantFocusability="blocksDescendants"属性,descendantFocusability表示子控件均失去焦点。
2. ListView中含有checkBox时,选中CheckBox时,滑动listView会发现有多个选中的checkBox,即发生了错位,这个主要是与adapter的getView方法的机制有关系,即listView的每个界面都显示固定的item数,当滑动时,只是将前一屏的item重新绘制了一遍,这个可以先去了解下自定义adpter的getView的刷新机制。对于这个问题的解决办法是记录下选中的checkBox的位置(这个方法是当点击ListView的item时选中checkBox的前提),在getView中根据选中位置进行设置checkBox的状态。具体代码见下面:
private List<String> selectPosition = newArrayList<String>();
privateclass ListItems {
CheckBox itemChechBox;
TextView itemName;
}
@Override
public View getView(int
position, ViewconvertView, ViewGroup parent) {
ListItemsitems =
null;
if (convertView ==
null) {
items =
new ListItems();
convertView=
mInflater.inflate(R.layout.upload_from_file_browser_item,
null);
items.itemChechBox =(CheckBox) convertView.findViewById(R.id.cb_choose_file);
items.itemName = (TextView)convertView.findViewById(R.id.tv_upload_item);
convertView.setTag(items);
}
else {
items =(ListItems) convertView.getTag();
}
mListView.setOnItemClickListener(newOnItemClickListener()
{
@Override
publicvoidonItemClick(AdapterView<?> arg0, View
view, int position,
long id) {
ListItemsitem = (ListItems) view.getTag();
if (selectPosition.contains(""
+position)) {
item.itemChechBox.setChecked(false);
selectPosition.remove("" +position);
}else {
selectPosition.add(""
+position);
item.itemChechBox.setChecked(true);
//记录选中的item的位置
item.itemChechBox.setChecked(true);