今天突然发现ListView的OnItemClickListener监听事件中的position返回是从1开始的,一直觉得很奇怪,在群里问了后,可能是headerView的问题,特意去查了一番,原来是如此:
特此记过!
(1)添加HeaderView之后尺寸布局被忽略。
通常添加头部的方法是
1
2
3
|
LayoutInflater
lif = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View
headerView = lif.inflate(R.layout.header, null );
mListView.addHeaderView(headerView);
|
原因:lif.inflate(R.layout.header, null)丢失了XML布局中根View的LayoutParam,应该使用的是
1
|
lif.inflate(R.layout.header,
mListView, false );
|
(2)添加HeaderView之后导致OnItemClickListener的position移位
OnItemClickListener接口的方法:
1
|
void
onItemClick(AdapterView<?> parent, View view, int
position, long
id)
|
position通常是从0开始的,但是添加了HeaderView之后,position也会将HeaderView的数目计算进去。几个解决办法:1,手动计算真实的position位置:
1
2
3
4
5
6
7
8
|
final
headerCount = 1 ;
mListView.setOnItemClickListener( new
OnItemClickListener() {
@Override
public
void
onItemClick(AdapterView<?> parent, View view,
int
position, long
id) {
Item
item = myAdapter.getItem(position - headerCount);
}
});
|
2,其实上面的步骤ListView已经为我们提供了,所以可以改写为:
1
2
3
4
5
6
7
|
mListView.setOnItemClickListener( new
OnItemClickListener() {
@Override
public
void
onItemClick(AdapterView<?> parent, View view,
int
position, long
id) {
Item
item = parent.getAdapter().getItem(position);
}
});
|
原因在源码中有比较清晰的解释:当有headerView被添加时,实际传递给ListView的adapter被包装,parent.getAdapter()返回真实被ListView使用的Adapter(HeaderViewListAdapter),HeaderViewListAdapter的getItem(int)方法处理了position的问题。
(3)LayoutInflater的infalte()
用来呼应第一个问题。LayoutInflater的作用很简单,就是将XML的布局文件“翻译”成相应的View对象,而且出于性能的考虑,LayoutInflater只能处理编译后的XML文件,而不能处理通常明文编码的XML文件。最常用的一个方法:
1
|
View
inflate( int
resource, ViewGroup root, boolean
attachToRoot)
|
其中:resource是布局文件IDroot是父ViewGroup对象,attachToRoot是是否将“翻译”出来的View添加到上面的root中root和attachToRoot是共同作用的:1,有root,同时attachToRoot为false,那么inflate()返回的就是“翻译”得到的view2,有root,同时attachToRoot为true,那么inflate()就是将“翻译”得到的view添加到root后,然后返回root3,无root,同时attachToRoot为false,那么inflate()返回的就是“翻译”得到的view。4,无root,同时attachToRoot为true,报错。另外,root还有一个重要的作用就是为“翻译”得到的view添加合适的LayoutParam,并且如果并不想将得到的View添加到root的话,传递何种root是并没有要求的,比如:
1
2
3
|
View
view = mLayoutInflater.inflate(R.layout.header, new
ListView(mContext), false );
View
view = mLayoutInflater.inflate(R.layout.header, new
LinearLayout(mContext), false );
View
view = mLayoutInflater.inflate(R.layout.header, new
RelativeLayout(mContext), false );
|
上面得到的View,除了view的LayoutParam分别为AbsListView.LayoutParams,LinearLayout.LayoutParams,RelativeLayout.LayoutParams之外,内容都一致。
转载地址: http://my.oschina.net/xesam/blog/155542#OSC_h2_1
分享到:
相关推荐
android ListView添加HeadView的demo
Android ListView中headerview的动态显示和隐藏的实现方法 1.动态设置headerview的方法 动态设置headerview有两个思路。 方法一 将header的布局写在list item的布局文件中,在adapter中通过判断position的值是否为0...
listview 实现隐藏显示headerview
listview 头部HeaderView 可以切换图片,模拟网易,新浪,百度新闻客户端效果.
listview 头部HeaderView 可以切换图片,模拟网易,新浪,百度新闻客户端效果.
代码为博客的实例代码:http://blog.csdn.net/lmj623565791/article/details/40708791 有问题请博客留言
listview的headerView可现实上推隐藏。。。。。。。。。。。。。。。。。。。。。。。。
左右两个listview.左侧分类,右侧显示全部(有headerview)。点左侧分类,右侧定位到该类别下item.滑动右侧,左侧联动定位到当前分类。仿外卖超人,美团,生活半径
我们可以看到 ListView 的 HeaderView 会跟随 ListView 的滑动而变大,HeaderView里的图片会有缩放效果。这些可以使用属性动画来实现。接下来我们就来动手吧! 首先自定义几个属性,在之后可以用到: <?xml ...
ListView的模板写法 ListView模板写法的完整代码: •android代码优化—-ListView中自定义adapter的封装(ListView的模板写法) 以后每写一个ListView,就这么做:直接导入ViewHolder.java和ListViewAdapter,然后...
自定义下拉刷新ListView 及 拖拽调换item位置ListView 可以分开使用 也可以一起使用,定义adapter进行headerView及footerView的自定义
并且每一个item都可以有点击事件,类似listview. setOnItemClickListener事件 因为添加了headerview以及footerview,position会根据headerview的个人进行偏移,暂时没有想到好的方法,我会继续更改的
ListView在实际实用中,一般都会有下新刷新和上拉加载的动态效果,今天要学的就是如何自定义带下拉刷新的ListView。... 自定义CustomListView继承自ListView,添加headerView,里面的布局是有下拉刷新的文字
我们在使用ListView的时候,一般都会为ListView添加一个响应事件android.widget.AdapterView.OnItemClickListener。对OnItemClickListener的position和id参数,我相信有些人在这...在我们没有为listview添加headerView
点击item中的布局实现弹出动画,再次点击动画就会收回去。
首先给listView增加一个HeaderView,避免第一个Item被Toolbar遮挡。 View header=new View(this); header.setLayoutParams(new AbsListView.LayoutParams( AbsListView.LayoutParams.MATCH_PARENT, (int)...
listview的下拉刷新上拉加载,adapter的优化,headerView、footerView的添加
首先,我们先来了解ListView的两个属性以及它们的API解析 android:headerDividersEnabled:When set to false, the ListView will not draw the divider after each header view....可见,这里两个属性都只对HeaderView
仿QQ的下拉刷新,非ListView直接添加HeaderView,避免了各种问题。可以自定义下拉头,使用方便