Android修炼之道—ListView的HeaderView的问题
来源:互联网 发布:哪个理财软件最好 编辑:程序博客网 时间:2024/05/21 22:25
参考自http://my.oschina.net/xesam/blog/155542
(1)添加HeaderView之后尺寸布局被忽略。
通常添加头部的方法是1
LayoutInflater lif = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
2
View headerView = lif.inflate(R.layout.header,
null
);
3
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
final
headerCount =
1
;
2
mListView.setOnItemClickListener(
new
OnItemClickListener() {
3
@Override
4
public
void
onItemClick(AdapterView<?> parent, View view,
5
int
position,
long
id) {
6
Item item = myAdapter.getItem(position - headerCount);
7
}
8
});
2,其实上面的步骤ListView已经为我们提供了,所以可以改写为:
1
mListView.setOnItemClickListener(
new
OnItemClickListener() {
2
@Override
3
public
void
onItemClick(AdapterView<?> parent, View view,
4
int
position,
long
id) {
5
Item item = parent.getAdapter().getItem(position);
6
}
7
});
原因在源码中有比较清晰的解释:
当有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是布局文件ID
root是父ViewGroup对象,
attachToRoot是是否将“翻译”出来的View添加到上面的root中
root和attachToRoot是共同作用的:
1,有root,同时attachToRoot为false,那么inflate()返回的就是“翻译”得到的view
2,有root,同时attachToRoot为true,那么inflate()就是将“翻译”得到的view添加到root后,然后返回root
3,无root,同时attachToRoot为false,那么inflate()返回的就是“翻译”得到的view。
4,无root,同时attachToRoot为true,报错。
另外,root还有一个重要的作用就是为“翻译”得到的view添加合适的LayoutParam,并且如果并不想将得到的View添加到root的话,传递何种root是并没有要求的,比如:
1
View view = mLayoutInflater.inflate(R.layout.header,
new
ListView(mContext),
false
);
2
View view = mLayoutInflater.inflate(R.layout.header,
new
LinearLayout(mContext),
false
);
3
View view = mLayoutInflater.inflate(R.layout.header,
new
RelativeLayout(mContext),
false
);
0 0
- Android修炼之道—ListView的HeaderView的问题
- [Android]LIstView的HeaderView
- ListView的headerView 焦点问题
- Android修炼之道—可回弹的ListView
- Android ListView HeaderView和FooterView引出的Position问题
- Android ListView添加了HeaderView后,出现点击HeaderView区域跳转的问题
- Android ListView 添加 HeaderView后,HeaderView的布局不起作用
- 关于ListView的HeaderView
- ListView的HeaderView
- LIstView的HeaderView, FooterView
- Listview的HeaderView
- ListView的HeaderView
- ListView的HeaderView
- ListView的HeaderView
- ListView的HeaderView
- 5.3 ListView的HeaderView
- 关于ListView的HeaderView
- ListView的HeaderView
- 【学习笔记】红黑树的实现(二):删除算法
- 装SQL Server 2005中报错,错误说明:事务管理器不可用。
- 用什么方法可以恢复视频mp4格式文件呢
- Linux下批量杀掉 包含某个关键字的 程序进程
- golang字符、字符串的那些事儿
- Android修炼之道—ListView的HeaderView的问题
- c++中关于数组作为函数参数并传递数组元素个数的几种有效方法的讨论
- 自定义java 线程池
- Zstack之HAL层增加新的按键key的分析笔记3
- 拓扑排序——nyoj 496
- oracle10g获取Date类型字段无时分秒解决办法!
- 软工视频总结
- c# 中常用的正则表达式总结
- ubuntu spark中文乱码解决方法