ListView添加头部之后出现位置获取错乱的问题解决方案
2015-11-13 10:13
281 查看
/** *Addafixedviewtoappearatthetopofthelist.IfaddHeaderViewis *calledmorethanonce,theviewswillappearintheordertheywere *added.Viewsaddedusingthiscallcantakefocusiftheywant. *<p> *NOTE:CallthisbeforecallingsetAdapter.ThisissoListViewcanwrap *thesuppliedcursorwithonethatthatwillalsoaccountforheader *views. * *@paramvTheviewtoadd. *@paramdataDatatoassociatewiththisview *@paramisSelectablewhethertheitemisselectable */ public void addHeaderView(Viewv,Objectdata, boolean isSelectable){ if (mAdapter!= null ){ throw new IllegalStateException( "Cannotaddheaderviewtolist--setAdapterhasalreadybeencalled." ); } FixedViewInfoinfo= new FixedViewInfo(); info.view=v; info.data=data; info.isSelectable=isSelectable; mHeaderViewInfos.add(info); } /** *SetsthedatabehindthisListView. * *Theadapterpassedtothismethodmaybewrappedbya{@linkWrapperListAdapter}, *dependingontheListViewfeaturescurrentlyinuse.Forinstance,adding *headersand/orfooterswillcausetheadaptertobewrapped. * *@paramadapterTheListAdapterwhichisresponsibleformaintainingthe *databackingthislistandforproducingaviewtorepresentan *iteminthatdataset. * *@see#getAdapter() */ @Override public void setAdapter(ListAdapteradapter){ if ( null !=mAdapter){ mAdapter.unregisterDataSetObserver(mDataSetObserver); } resetList(); mRecycler.clear(); if (mHeaderViewInfos.size()> 0 ||mFooterViewInfos.size()> 0 ){ mAdapter= new HeaderViewListAdapter(mHeaderViewInfos,mFooterViewInfos,adapter); } else { mAdapter=adapter; } //其它的一些代码这里省略之... } |
addHeaderView一定要在
setAdapter之前调用,如果不这样做,
addHeaderView会抛出一个异常。Android为什么要这样?这是因为,在
setAdapter的时候,会针对我遇到的这种情况(也就是添加Header后
position不正确的这种情况)做些特殊的处理。
setAdapter在内部判断了当前ListView是否有Header或者Footer,如果没有,就直接使用参数传进来的adapter;如果有,则用一个decorated的
HeaderViewListAdapter来替换参数。这个
HeaderViewListAdapter的使命,就是排除Header和Footer,让
position(当然也包括
position参数)正确返回。
分析到这里,解决方案就出来了:在
onItemClick不要直接使用我们声明的adapter,而是用ListView里的那个decorated
adapter。获取它的方法就是调用
parent.getAdapter()。当然,如果ListView没有Header和Footer,直接使用声明的adapter也没有问题,不过为了避免出错,还是统一使用decorated
adapter比较好。
把onItemClick改成下面这样,就可以了
@Override public void onItemClick(AdapterView<?>parent,Viewv, int position, long id){ // doSomething(parent.getAdapter().getItem(position)); listOut.get((int) parent.getAdapter().getItemId(position)//这是正确的Id } | |
相关文章推荐
- Java并发模型框架
- DB_BLOCK_CHECKSUM和DB_BLOCK_CHECKING
- AIR ANE应用添加KeyMob广告管理库详细教程
- Cloud Design Pattern - Pipes and Filters Pattern(管道及过滤器模式)
- R语言-数据排序
- Android 4.4 的 init 进程详解
- 响应式布局这件小事
- IBM X335 RAID1 制作
- silverlight开发实例(Prism+MVVM+RIA)(二)--创建shell及用户登录
- STL——迭代器与traits编程技法
- 从”JAVA“而终 21:Html讲解
- Apache + SVN 环境搭建及svnsync 主备详解
- unity 菜单栏添加新菜单
- 毛玻璃效果
- 队列应用2:求解迷宫问题,最短路径
- 同样一个程序,为什么我的VS2010调试很慢
- ScrollView中嵌套GridView时显示不全
- BI项目SSIS如何从平面文件源导入GUID类型数据至OLE DB目标
- 课外学习(一)
- HttpURLConnection往服务器发送请求