原 [Android]LIstView的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是布局文件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
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之外,内容都一致。
原 [Android]LIstView的HeaderView的更多相关文章
- Android listview addHeaderView 和 addFooterView 详解
addHeaderView()方法:主要是向listView的头部添加布局addFooterView()方法:主要是向listView的底部添加布局 需要注意的是添加布局的时候应该添加从父容器开始添加 ...
- Android GridView增加HeaderView和FooterView的实现
Android GridView增加HeaderView和FooterView的实现 做的项目中遇到一个问题,需要实现一个页面 页面的上面是一个自定义的View和GridView,当向下滚动屏幕的时候 ...
- xamarin android listview的用法
listview也许是用的非常频繁的一个控件之一,下面我写一个xamarin的listview栗子,大家尝一尝xamarin android开发的乐趣.原谅我的大小写吧. listview绑定自定义的 ...
- Android ListView and Tips.
Tips: ListView嵌套ListView,有footerView时.须要又一次measure高度时,footerview最顶层的view不能是RelativeLayout,最好用LinearL ...
- ListView的HeaderView包含的GridView滑动隐藏后无法点击问题分析
目录 1 现象 2 问题分析 2.1 滑动前 2.2 滑动后 2.3 mDataChanged赋值为true的位置 2.3 GridView直接作为ListView的HeaderView为什么可以滑动 ...
- android ListView 九大重要属性详细分析、
android ListView 九大重要属性详细分析. 1.android ListView 一些重要属性详解,兄弟朋友可以参考一下. 首先是stackFromBottom属性,这只该属性之后你做好 ...
- Android ListView onItemClick Not Work
Android ListView onItemClick Not Work ListView item中有Button和RadioButton的时候,它的Item点击事件不起作用,需要设置item的属 ...
- 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d3e3ab10c62013697408 作者:黄宁源 一,背景 Recy ...
- Android ListView 常用技巧
Android ListView 常用技巧 Android TextView 常用技巧 1.使用ViewHolder提高效率 ViewHolder模式充分利用了ListView的视图缓存机制,避免了每 ...
随机推荐
- mysql 取消命令行继续编辑
mysql> create database mingongge defa\c#回车 置空mysql> 加一个\c cancel 编辑命令 回车
- 【原创】SSAS-引用维度与多数据源、多数据源视图引发分区错误
背景: 最近有个项目,有32家分公司,集团总部需要取这个32家分公司数据做分析,由于每个分公司的数据都比较庞大,所以最终方案是每个分公司一个DW,在cube搭建过程中将每个公司数据作为一个分区数据的来 ...
- [PHP] print_r()函数美化
function beautiful_print_r($arr){ echo '<pre>'; print_r($arr); echo '</pre>'; }
- hiho一下第130周 后缀自动机二·重复旋律7
后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的 ...
- Servlet 工作原理
Servlet运行在Servlet容器中,由容器负责Servlet实例的查找及创建工作,并按照Servlet规范的规定调用Servlet的一组方法,这些方法也叫生命周期的方法.具体调用过程如下图所示: ...
- 可持久化线段树(主席树)(图文并茂详解)【poj2104】【区间第k大】
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63740442 向大(hei)佬(e)实力学(di ...
- 使用gtest自动化测试并给出性能测试结果(windows 版本,版本平台也可以使用,但并没有做完整的测试)
/************************************************************* *使用gtest自动化测试 * ********************* ...
- mysql悲观锁中的共享锁和排他锁
概述: 共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改. 排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一 ...
- Android中调用系统所装的软件打开文件(转)
Android中调用系统所装的软件打开文件(转) 在应用中如何调用系统所装的软件打开一个文件,这是我们经常碰到的问题,下面是我所用到的一种方法,和大家一起分享一下! 这个是打开文件的一个方法: /** ...
- Vue2.0进阶组件 短信倒计时组件
原本我想隔个几天再发文章,刚好今天项目上线,环境有问题,导致只有干等,刚好要为公司打造一套属于公司自己的一系列功能组件,这个使命就交给我了,大家也一直叫我来点干货,说实话我只是一个湿货,肚子里干一点就 ...