当ListView有Header时,onItemClick里的position不正确
2015-07-07 18:31
706 查看
当给ListView加了一个HeaderView后(代码如下),我们发现,onItemClick方法里的
Google了下,发现有个老外issue过一个bug,和我遇到的问题一样,不过这个bug被RomainGuy
reject掉了,理由是,你用错了,请用getAdapter。这回答的太简洁了,完全没法理解,所以只好又去仔细研究ListView的代码,终于领会他的意思了。把其中addHeaderView和setAdapter方法贴下来
从代码和注释里都可以很清楚的得知,
分析到这里,解决方案就出来了:在
adapter。获取它的方法就是调用
adapter比较好。
把onItemClick改成下面这样,就可以了
本文由Roy最初发表于:http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview.html,你可以在保持文章完整和保留本声明的情况下转帖、分发和印刷等。
position参数的值不是我们所期望的,比如点击ListView的第一行,我们期望的
position是0,可是实际上却是1,也就是说,它是从Header而不是从第一行开始计数的。
reject掉了,理由是,你用错了,请用getAdapter。这回答的太简洁了,完全没法理解,所以只好又去仔细研究ListView的代码,终于领会他的意思了。把其中addHeaderView和setAdapter方法贴下来
addHeaderView一定要在
setAdapter之前调用,如果不这样做,
addHeaderView会抛出一个异常。Android为什么要这样?这是因为,在
setAdapter的时候,会针对我遇到的这种情况(也就是添加Header后
position不正确的这种情况)做些特殊的处理。
setAdapter在内部判断了当前ListView是否有Header或者Footer,如果没有,就直接使用参数传进来的adapter;如果有,则用一个decorated的
HeaderViewListAdapter来替换参数。这个
HeaderViewListAdapter的使命,就是排除Header和Footer,让
position(当然也包括getItem, getItemId)等方法的
position参数)正确返回。
分析到这里,解决方案就出来了:在
onItemClick不要直接使用我们声明的adapter,而是用ListView里的那个decorated
adapter。获取它的方法就是调用
parent.getAdapter()。当然,如果ListView没有Header和Footer,直接使用声明的adapter也没有问题,不过为了避免出错,还是统一使用decorated
adapter比较好。
把onItemClick改成下面这样,就可以了
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories