ListView添加头部之后出现位置获取错乱的问题解决方案
来源:互联网 发布:mac清理垃圾桶快捷键 编辑:程序博客网 时间:2024/06/07 01:54
/**
* Add a fixed view to appear at the top of the list. If addHeaderView is
* called more than once, the views will appear in the order they were
* added. Views added using this call can take focus if they want.
* <p>
* NOTE: Call this before calling setAdapter. This is so ListView can wrap
* the supplied cursor with one that that will also account for header
* views.
*
* @param v The view to add.
* @param data Data to associate with this view
* @param isSelectable whether the item is selectable
*/
public
void
addHeaderView(View v, Object data,
boolean
isSelectable) {
if
(mAdapter !=
null
) {
throw
new
IllegalStateException(
"Cannot add header view to list -- setAdapter has already been called."
);
}
FixedViewInfo info =
new
FixedViewInfo();
info.view = v;
info.data = data;
info.isSelectable = isSelectable;
mHeaderViewInfos.add(info);
}
/**
* Sets the data behind this ListView.
*
* The adapter passed to this method may be wrapped by a {@link WrapperListAdapter},
* depending on the ListView features currently in use. For instance, adding
* headers and/or footers will cause the adapter to be wrapped.
*
* @param adapter The ListAdapter which is responsible for maintaining the
* data backing this list and for producing a view to represent an
* item in that data set.
*
* @see #getAdapter()
*/
@Override
public
void
setAdapter(ListAdapter adapter) {
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
(当然也包括getItem, getItemId)等方法的position
参数)正确返回。
分析到这里,解决方案就出来了:在onItemClick
不要直接使用我们声明的adapter,而是用ListView里的那个decorated adapter。获取它的方法就是调用parent.getAdapter()
。当然,如果ListView没有Header和Footer,直接使用声明的adapter也没有问题,不过为了避免出错,还是统一使用decorated adapter比较好。
把onItemClick改成下面这样,就可以了
@Override
public
void
onItemClick(AdapterView<?> parent, View v,
int
position,
long
id) {
//
doSomething(parent.getAdapter().getItem(position));
listOut.get((int) parent.getAdapter().getItemId(position)//这是正确的Id
}
1 0
- ListView添加头部之后出现位置获取错乱的问题解决方案
- ViewPager添加ListView时出现多层ListView嵌套 界面错乱问题解决
- 屏幕旋转之后,ListView表格表头位置错乱 与onConfigurationChanged方法的使用【安卓布局】
- Android ListView异步加载网络图片出现位置错乱闪烁及优化ListView的加载
- 苹果改版之后,关于隐私协议添加的问题解决方案
- 安卓ListView的Item添加按钮,点击错乱问题解决办法
- listview图片错乱问题解决
- Android 解决ListView异步加载网络数据(图片文字)出现位置错乱以及优化ListView的加载
- Android ListView数据错乱问题解决
- recyclerView的checkBox复用错乱问题解决方案
- Discuz!教程之后台安装任何插件都出现空白的问题解决方案
- ListView头部添加ViewPager
- ListView快速添加头部
- listview中使用checkbox滑动或者加载更多数据错乱问题解决方案
- RecycleView的Item数据出现随机错乱重复问题解决
- ListView 重用CheckBox出现错乱
- adapter动态更新数据后滑动出现数据错乱问题解决方案
- Listview滑动过程中item出现数据错乱的解决方法
- ASP.NET调用JAVA的CXF生成的Webservice,并带有Soapheader验证的解决方案
- 协方差的意义和计算公式、Code
- DB_BLOCK_CHECKSUM和DB_BLOCK_CHECKING
- AIR ANE应用添加KeyMob广告管理库详细教程
- IBM X335 RAID1 制作
- ListView添加头部之后出现位置获取错乱的问题解决方案
- RCNN物体检测
- Android 4.4 的 init 进程详解
- 一些iOS面试题2
- Spring如何加载XSD文件(org.xml.sax.SAXParseException: Failed to read schema document错误的解决方法)
- 使用ShareSDK手机端和服务器的交互流程图
- Postgresql9.3安装和使用
- 电商双11已臻巅峰,众筹的双11才刚刚开始
- jQuery EasyUI使用教程之创建可折叠面板