原 [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之外,内容都一致。

时间: 2024-10-16 12:45:36

原 [Android]LIstView的HeaderView的相关文章

android ListView隐藏FooterView(headerView)

在安卓开发中,在使用listView时,我们会经常用到footerView或者headerView 给ListView添加的footer和header好多时候,会根据情况隐藏和显示. 因为footer和header使用删除和添加的方法总感觉不好. 而直接设置footer和header中的view为GONE时,虽然内容不显示了,但是这块区域还是会被占用. 经过各种方法测试,最后得出一个可以完美解决该问题的方法,如下代码: this.footerLayout.setVisibility(View.G

关于ListView的HeaderView

1. 可点击/不可点击 private void addHeaderView(){ View headerView = this.mInflater.inflate(R.layout.XXX_header_info, this.listView, false); this.headerInfo = (TextView) headerView.findViewById(R.id.XXX_HeaderInfo); //this.listView.addHeaderView(headerView);

Android listview addHeaderView 和 addFooterView 详解

addHeaderView()方法:主要是向listView的头部添加布局 addFooterView()方法:主要是向listView的底部添加布局 需要注意的是添加布局的时候应该添加从父容器开始添加,而不能直接添加父容器中的子控件.例如:从一个xml布局文件中添加一个button控件, 只能将整个布局xml文件添加进去.而不能单单只添加button控件. 当添加头部和底部布局还有另外一个重载方法就是addHeaderView(headView, null, false) 和addFooter

android ListView注意事项

所有问题,都是自己遇到过的. 但内容,有一半是自己写的,也有一半是复制过来. 所以,写成原创还请原谅 1. ListView添加标题后(addHeader())后,使用listView.getAdapter获取的对像是被Header封装后的HeaderViewListAdapter对像.所以,为了获取自定义Adapter,方法为: HeaderViewListAdapter adapter=(HeaderViewListAdapter)dayBillListView.getAdapter();

Android ListView and Tips.

Tips: ListView嵌套ListView,有footerView时.须要又一次measure高度时,footerview最顶层的view不能是RelativeLayout,最好用LinearLayout包RelativeLayout.否则 View.measure(0,0)会报异常. ListView 加HeaderView.在OnItemClick时.position 把HeaderView算进去了. EditText android:textCursorDrawable="@null

Android——ListView布局+适配器(三)

Android--ListView布局+适配器(三) package com.example.administrator.newstop; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import andro

Android——ListView多布局+适配器(二)

Android--ListView多布局+适配器(二) <span style="font-size:18px;">package com.example.administrator.newstop.entity; /** * Created by Administrator on 2016/8/4. */ public class News { private String title; private String pubDate; private int img; p

Android ListView复杂列表优化实践

原文:Android ListView复杂列表优化实践 很多社交App都不免会涉及到复杂的列表元素实现,一个列表上面可能大量的图片,不定长的评论列表,给手机端的程序员带来了不少的挑战.本文就是在实现复杂的列表滑动的情况下,利用已知的优化方法指导下的一次优化实践,旨在提升ListView的滑动流畅度,为用户带来良好的体验. 1:设计稿: 这是列表中可能出现的ItemView,有两种,但是又有许多相同的地方,比如一样有点赞的图片,评论等...其中,评论和点赞的数量是可变的. 2:使用一般布局带来的问

[转]Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件

Android ListView最佳处理方式,ListView拖动防重复数据显示,单击响应子控件. 1.为了防止拖动ListView时,在列表末尾重复数据显示.需要加入 HashMap<Integer,View> lmap = new HashMap<Integer,View>();其中Integer为列表位置,View为子项视图,加入数据前首先if (lmap.get(position)==null) ,满足条件时,加入lmap.put(position, convertView