Android开发ListView中含有checkBox或者Button时会遇到的难题
2013-12-07 22:58
344 查看
android开发经常会遇到ListView中含有checkBox和Button的情况,这里主要会有三个问题,下面分别论述:
selectPosition.add("" +position);
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的位置
}});
if (selectPosition.contains("" +position)) {
// 显示选中的checkBox
items.itemChechBox.setChecked(true);
} else {
items.itemChechBox.setChecked(false);
}
}
return convertView;
}
3. ListView中含有Button时,我们有时需要知道点击button位于listView的哪个position下,即要获取item的数据,由于button的click事件是异步的,无法得到点击的位置,这个原因与上面的checkBox类似,这时有一个办法是给button设置Tag,点击时获取tag来判断位置,实现代码如下:
@Override
public View getView(int position, ViewconvertView, ViewGroup parent) {
ListHolderholder;
if (convertView == null) {
holder =new ListHolder();
convertView= mInflater.inflate(R.layout.homework_list_item, null);
holder.homeworkUpload = (Button)convertView.findViewById(R.id.homework_list_btn_uploadhomework);
convertView.setTag(holder);
}else {
holder =(ListHolder) convertView.getTag();
}
holder.homeworkUpload.setTag(position);
holder.homeworkUpload.setOnClickListener(new OnClickListener(){
@Override
publicvoid onClick(View v) {
/**
* 上传家庭作业功能暂时屏蔽
*/
Log.i("hubei", "click position:"+v.getTag());
Object homework = list.get(Integer.parseInt(""+v.getTag()));
}
});
}
return convertView;
}
相关文章推荐
- Android开发ListView中含有checkBox或者Button时会遇到的难题
- Android开发ListView中含有checkBox或者Button时会遇到的难题
- ListView中含有CheckBox或者Button等控件,导致item点击无效的原因。
- android开发遇到make is not found in path 或者是报加载不到so库的错误
- Android ListView Item含有RadioButton、CheckBox、RatingBar、EditText
- android ListView的Item中包含Button,CheckBox等可点击view的处理
- 第七周Android(CheckBox /ImageView/ListView/ImageButton/AdapterView)
- Android开发ListView中包含EditText控件遇到的问题
- Android开发:实现带图片和checkbox的listview
- android开发中ListView中存在Button时ListView无法获取焦点(笔记)
- android listView含CheckBox、Button、EditText
- 在ListView的item项里使用CheckBox或者Button时,OnItemClickListener无响应的问题
- Android中ListView中有button,checkbox,GridView的用法【安卓进化二十五】
- android开发过程中遇到的一些问题(包括自定义ProgressBar, Intent, Animation, ListView, RadioButton)
- Android开发:实现带图片和checkbox的listview
- Android ListView加入CheckBox/RadioButton选择状态保持、全选、反选
- Android开发:实现带图片和checkbox的listview
- Android ListView 中加入CheckBox/RadioButton 选择状态保持、全选、反选实现
- Android中ListView中有button,checkbox,GridView的用法
- 关于ListView中含有CheckBox,Button等控件失去焦点的解决办法