文档章节

ListView的HeaderView

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:40
字数 682
阅读 17
收藏 0


 今天突然发现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 是布局文件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之外,内容都一致。 


转载地址:  http://my.oschina.net/xesam/blog/155542#OSC_h2_1

本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/38276403

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
Why Is ListView's HeaderView/FooterView setVisibil

Why Is ListView's HeaderView/FooterView setVisibil 杨辉的个人博客2015-06-19121 阅读 listview 使用 的时候,根据需求需要动态将HeaderView/FooterView隐藏掉,这时你会发现 根本没有效果...

杨辉的个人博客
2015/06/19
0
0
ListView设置headerview和footerview

【简介】 headerview就是通常看到的那种listview手势下滑露出上面的部分,下拉到一定位置,松手会开始请求网络数据,然后刷新listview的列表。 footerview一般就是listview手势一直上滑动到显...

jonh_felix
2015/11/17
3.2K
0
Android:ListView

一、HeaderView显示问题: 给ListView添加了一个headerView后,运行后界面上不会出现headerView布局。测试发现,当给ListView设置adapter后,headerView就可以显示了。 例如: listView = (...

Xushao
2014/02/24
0
0
android中ListView控件添加HeaderView后子项里的Button控件的点击事件出错

ListView的子项的布局文件有一个 ToggleButton 控件和一个 TextView 控件 lvMyDevice是一个 ListView 控件 在 Fragment 的 onViewCreated 方法中 //初始化 headerview 和 footerview headerv...

秋风若影
2015/05/08
2.2K
1
SwipeRefreshLayout的使用问题

应该有人用过SwipeRefreshLayout这个组件吧,今天用这个组件进行ListView的下拉刷新,但是ListView含有HeaderView,然后下拉后小球就不能回缩动画了,而且页面也卡住了,动不了。有大神怎么这...

xhh199147
2015/08/07
3.4K
4

没有更多内容

加载失败,请刷新页面

加载更多

Oracle SQL语法实例合集

如需转载请注明出处https://my.oschina.net/feistel/blog/3052024 目的:迅速激活Oracle SQL 参考:《Oracle从入门到精通》 ------------------------------------------------------------......

LoSingSang
今天
2
0
增加 PostgreSQL 服务进程的最大打开文件数

https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7 要在systemd的配置里加才行...

helloclia
今天
2
0
组合模式在商品分类列表中的应用

在所有的树形结构中最适合的设计模式就是组合模式,我们看看常用商品分类中如何使用。 先定义一个树形结构的商品接口 public interface TreeProduct { List<TreeProduct> allProducts(...

算法之名
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部