关于ListView加入HeaderView之后,点击条目时获得position参数移位的BUG修正

来源:互联网 发布:mac dashboard是什么 编辑:程序博客网 时间:2024/05/29 02:31

今天遇到一个问题,在ListView的时候,要在首部加一个轮播图组件,调用的是ListView的addHeaderView(View v, Object data, boolean isSelectable)方法,这个方法可以把一个view放置到Listview的顶部显示,也可以多次调用,使得多个view按照添加的顺序,依次排列在ListView的顶部显示。

        

        这样做了之后是显示是没问题的,但是遇到一个问题就是在ListView的Adapter的构造方法中,要添加ListView的条目点击事件:mListView.setOnItemClickListener(this); 

        然后在Adapter里面实现onItemClick(AdapterView<?> parent, View view, int position,long id)方法,在通过position取数据的时候发现一个问题,就是点击的条目错位了,点击一个条目,结果响应事件变成了下一个条目对应的事件。


        经过探查之后发现,本来ListView条目的position是从0开始计算的:0,1,2...这样,但是添加了一个Header之后,position变成了从1开始,于是需要手动修正一下这个postion的值。

        好在Android中有提供一个对应的API来得到HeaderView的数量,那就是ListView中的一个方法:getHeaderViewsCount(),这个方法可以得到这个ListView添加了多少个HeaderView,然后我们需要做的只是在使用position之前,修正一下:


于是我在重写Adapter的getItem方法时加入如下代码:


[java] view plain copy
  1. // TODO 修正有Header的ListView的position的BUG  
  2. int headerViewsCount = listView.getHeaderViewsCount();//得到header的总数量  
  3.               
  4. //得到新的修正后的position  
  5. int newPosition = position - headerViewsCount;  



ok,问题解决。



事实往往不是自己想的那样,程序崩溃了。。。



再去找原因,终于发现最终的解决方案了。实际发现不管listview有没有headview,对于adapter并不知道,所以adapter的position按照正常顺序。所以

大家应该知道该怎么改了吧?需要在listview的onitemclicklistener中修正postion,然后调用adapter的getItem方法即可:




ok,问题最终解决了!

阅读全文
0 0