最近在项目中发现当android的listview是多选模式加载数据的,那么listview的getCheckItemIds()方法所得到数据是不精确的,当你选中其中一项item,然后又取消的时候getCheckItemIds()还是能得到你刚刚取消的listitem的id值,原因在于google在Listview的源码中出现BUG,大家可以翻阅android 的Listview的getCheckItemIds()这个方法的源码就会发现这个问题,我的解决办法是重写一个adapter我现在是用的内部类实现代码如下:
class CommandListItemAdapter extends ArrayAdapter<String> { private int resources; private List<String> data; public CommandListItemAdapter(Context context, int resource, List<String> objects) { super(context, resource, objects); this.resources = resource; data = objects; } @Override public View getView(int position, View convertView, ViewGroup parent) { LinearLayout layout = null; if (convertView == null) { layout = new LinearLayout(context); LayoutInflater flater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); flater.inflate(resources, layout, true); CheckedTextView cText = (CheckedTextView) layout .findViewById(android.R.id.text1); cText.setText(getItem(position)); cText.setId(position); cText.setClickable(true); cText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CheckedTextView checkBox = (CheckedTextView) v; boolean isChecked = checkBox.isChecked(); checkBox.setChecked(!isChecked); } }); cbs.add(cText); } else { layout = (LinearLayout) convertView; } return layout; } @Override public String getItem(int position) { return data.get(position); } }
在这个adapter中我的ListItem布局文件是用的系统的android.R.layout.simple_list_item_multiple_choice文件,这个文件可以在android模拟器下面的platforms下面的目录中找到,如果有什么不明白大家可以去看下文件中是怎么定义的。
这里值得注意的是当listitem布局里面包含了checkbox的时候listview的onItemClickListener()事件将被checkbox的onClickListener()事件覆盖,这是由于checkbox的onClick事件优先级要高于ListView的onItemClick事件,解决的办法可以把checkbox的focus和和clickable和touchClickable等属性设置为false即可,我现在这里之所以设置为true是因为我用的系统的android.R.layout.simple_list_item_multiple_choice布局文件这个文件的clickabel属性默认是false,也不知道是什么原因,当触发listview的onItemClick事件的时候点击的那个listitem的下标位置会变动,比如说当前列表中有2条数据,当单击第一条的时候第2条会变成第一条,第一条会变成第二条数据,所以我只有利用前面说的BUG,让listView的ononItemClick事件失效,利用checkTextView的onClick事件来实现当用户单击ListItem时改变checkbox的状态,只是这种实现会导致单击listitem被单击时失去原有的效果。
至于listitem数据为什么会出现位置混乱的原因还正在研究中,如果高手知道原因不妨共享下解决方法与原因,呵呵。
总之感觉android平台的bug还是蛮多的啊,google的开发质量还有待提高啊。
解决Android ListView多选模式下数据不精确的问题
本文详细阐述了在Android项目中遇到的一个关于ListView多选模式下的数据获取问题,即getCheckItemIds()方法在取消选择后仍保留已取消项ID的情况。通过重写自定义Adapter类并利用CheckBox的点击事件来实现正确的数据更新,同时讨论了ListView与CheckBox事件冲突的解决方案。此外,文章还提出关于listitem数据位置混乱的原因正在研究中,并指出Android平台存在一些bug,建议Google提高开发质量。
160

被折叠的 条评论
为什么被折叠?



