Android listview addHeaderView 和 addFooterView 详解

addHeaderView()方法:主要是向listView的头部添加布局
addFooterView()方法:主要是向listView的底部添加布局

需要注意的是添加布局的时候应该添加从父容器开始添加,而不能直接添加父容器中的子控件。例如:从一个xml布局文件中添加一个button控件,
只能将整个布局xml文件添加进去。而不能单单只添加button控件。

当添加头部和底部布局还有另外一个重载方法就是addHeaderView(headView, null, false) 和addFooterView(footerView, null, false)方法,
这个方法与上面的方法区别在于:当给listView设置点击事件的时候,可以控制添加的布局是否可出发点击事件。区别是前一个方法可以控制header是否可
 以被selected,如果不想被selected则将第三个参数设置成false;

下面以addFooterView()方法为例:
addFooterView()方法必须放在listview.setadapter前面,给listview添加头部必须在绑定adapter前添加,否则会报错。
原因是当我们在调用setAdapter方法时android会判断当前listview是否已经添加header,如果已经添加则会生成一个
 新的tempadapter,这个新的tempadapter包含我们设置的adapter所有内容以及listview的header和footer。所以当我

们在给listview添加了header后在程序中调用listview.getadapter时返回的是tempadapter而不是我们通过setadapter

传进去的adapter。如果没有设置adapter则tempadapter与我们自己的adapter是一样的。
  listview.getadapter().getcount()方法返回值会比我们预期的要大,原因是添加了header。
  我们自定义adapter里面的getitem方法里面返回的position是不包括header的,是我们自定义adapter中数据position编号从0开始,
  也就是说与我们传进去的list的位置是一样的。
  而Activity中listview的onitemclick方法:
  public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3)
  arg2是当前click的位置,这个位置是指在tempadapter中的位置,从0开始如果listview中添加了header则0代表header。
  也就是说当我们在使用点击事件时,listView列中的位置为arg2-1
  
  一般在开发中,为了达到我们想要的动态添加的效果主要的做法是:在listview.setadapter之前添加所需要的控件,然后使用removeFooterView()方法移除控件。
  在这里需要注意的是,每对listView的动态操作都要进行一次removeFooterView()方法移除控件。否则listView会自动添加空白行,从而影响显示的效果。
 ----------------------------------------------------------------------------------------------

android listview addHeaderView和addFooterView的注意事项  :

1、item 内如果有button等控件时,在监听listview的onitemclick事件时,焦点会被item内的button、imagebutton等控 件抢走,
从而导致在listview设置了onitemclick事件后不会被触发。解决方法是在初始化item的时候屏蔽掉其内部button等控件的 焦点获取,
具体方法可以在自定义item的根控件中调用:

 setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 
这样就能阻塞字控件抢夺焦点,listview的onitemclick就能被正确触发,同时对item内部的button等控件也没有影响,他们在被点击时照样可以触发自身的点击事件。
 
2、当listview需要添加headerview时,可以通过调 用listview的addHeaderView(headView, null, false) 方法,
该方法还有一个重载方法 addHeaderView(headView);这两个方法的区别是前一个方法可以控制header是否可以被selected,如果不想被 selected则将第三个参数设置成false 
  
3、接着上面说的添加header,添加header时调用的 addHeaderView方法必须放在listview.setadapter前面,
意思很明确就是如果想给listview添加头部则必须在给其绑定 adapter前添加,否则会报错。
原因是当我们在调用setAdapter方法时会android会判断当前listview是否已经添加 header,
如果已经添加则会生成一个新的HeaderViewListAdapter,这个新的HeaderViewListAdapter包含我们 设置的adapter所有内容以及listview的header和footer。
所以当我们在给listview添加了header后在程序中调用 listview.getadapter时返回的是tempadapter而不是我们通过setadapter传进去的adapter。
如果没有设置 adapter则HeaderViewListAdapter与我们自己的adapter是一样的。 listview.getadapter().getcount()方法返回值会比我们预期的要大,原因是添加了header。

4、接着上面的HeaderViewListAdapter说,我们 自定义adapter里面的getitem方法里面返回的position是不包括header的,是我们自定义adapter中数据position编 号从0开始,也就是说与我们传进去的list的位置是一样的。

 

@Override

public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

Log.i("adapter", "position:"+position); //这个position就是我们数据的真实位置

}

而listview的onitemclick方法中:

public void onItemSelected(AdapterView<?> parent, View view, int position, long id)

position是当前click的位置,这个位置是指在HeaderViewListAdapter中的位置,从0开始如果listview中添加了header则0代表header。4、接着上面的HeaderViewListAdapter说,我们 自定义adapter里面的getitem方法里面返回的position是不包括header的,是我们自定义adapter中数据position编 号从0开始,也就是说与我们传进去的list的位置是一样的。


public View getView(int position, View convertView, ViewGroup parent) {

// TODO Auto-generated method stub

Log.i("adapter", "position:"+position); //这个position就是我们数据的真实位置

}

而listview的onitemclick方法中:

public void onItemSelected(AdapterView<?> parent, View view, int position, long id)

position是当前click的位置,这个位置是指在HeaderViewListAdapter中的位置,从0开始如果listview中添加了header则0代表header。

 

 关于FooterView的添加和删除
 *   3.1每次总是先remove掉FooterView
 *   3.2若有需求再add上FooterView

 
 
 我们通常在加载数据时,为了省流量不会一次性把数据全部下完,一般是分段下载。
 分段下载一般会在listview最后面放一个进度条表示正在加载数据,当数据加载完时,我们又要清除它。这时候就要注意了。
mLoadingLayout = (FrameLayout) View.inflate(this, R.layout.load, null);
   listView.addFooterView(mLoadingLayout);
   listView.requestFocus();

这是listview尾部添加一个进度条。
listView.removeFooterView(mLoadingLayout);
这是移除尾部的进度条。
有时候在移除时回报空指针,但listview不为null ,mLoadingLayout也不为null,但还是报空指针,原因是因为listview要分为三部分。
一是头部,二是中间部,三是尾部。在设置了头部或尾部时,必须要有中间部才能真正意义上的生效。没生效就去移除就会报空指针错误。
所以在 
listView.removeFooterView(mLoadingLayout);时

必须先调用 listView.setAdapter(adapter);(设置中间部)

adapter可以数据可以为0但不可为null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python教程--__init_.py的作用

__init__.py 的作用 python的每个模块的包中&#xff0c;都有一个__init__.py文件&#xff0c;有了这个文件&#xff0c;我们才能导入这个目录下的module。那么&#xff0c;__init__.py还有什么别的功能呢&#xff1f;其实&#xff0c;__init__.py里面还是可以有内容的&#xf…

在HTML中怎么去掉超链接的下划线?

<style type"text/css">a {text-decoration: none}</style> https://zhidao.baidu.com/question/253614370.html

ASP.NET AJAX Timer Trouble? Location is key.

If you’ve made much use of the ASP.NET AJAX Timer control, you may have noticed that it can behave somewhat unexpectedly. In this post, I’m going to take a closer look at how the Timer works and the most significant factor that influences it: Location.…

linq 分组求和的一般方法

//var query from d in expenseApplyModel.ApplyBillList.AsEnumerable() // group d by d.ExpenseItemID into g // select new // { // ExpenseItemID g.Key, // ExpenseAmount g.Sum(t > t.ExpenseAmount) // };//分组求和新添加的费用项目 var query expenseApplyMo…

在屏幕上打印杨辉三角

这就是杨辉三角&#xff0c;也叫贾宪三角。这于我们现在的学习联系最紧密的是2项式乘方展开式的系数规律。如图&#xff0c;在贾宪三角中&#xff0c;第3行的第三个数恰好对应着两数和的平方公式依次下去。 杨辉三角是一个由数字排列成的三角形数表&#xff0c;一般形式如下&am…

jquery 获取 A 标签 超级链接属性

var icon_nav_href1 $("#indexiconnavid>li:nth-child(1) a").attr("href"); //抓取当前url

apache ab 测试 apr_socket_connect(): 由于目标机器积极拒绝 无法连接

遇到这种情况一般是你开的并行数量太多了。。。例如:ab -c 1000 -n 10000 http://localhost/index.html 如此大的请求就会挂掉&#xff0c;不过还是有补救措施的&#xff0c;可以通过增加并发数上限解决这个问题&#xff0c;步骤如下&#xff1a; 1、停止Apache服务&#xff1b…

maven 结合idea入门

reference : http://www.cnblogs.com/ramantic/p/7735323.html转载于:https://www.cnblogs.com/tangchangcai/p/7735690.html

ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType)

1 imageView.setScaleType(ImageView.ScaleType.FIT_XY ); 1 这里我们重点理解ImageView的属性android:scaleType&#xff0c;即ImageView.setScaleType(ImageView.ScaleType)。android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / an…

CSS如何让DIV的宽度随内容的变化

让div根据内容改变大小 div{ width:auto; display:inline-block !important; display:inline; } https://www.cnblogs.com/limeiky/p/6289307.html

第一幕 基础起步

1、选择版本python2 or python3 话不多说 python3 2、不同操作系统下的安装配置python 2.1、Linux系统一般默认安装有python&#xff0c;打开终端窗口检查是否安装python&#xff0c;在终端输入python --version 或 python3 --version&#xff0c;如果有则会显示python版本&am…

footer置底的几种方式

/* 通过calc()函数让内容区块自动伸缩 */ .my-body{min-height: calc(71.7vh - 80px); } footer{height:50px; } 参考 :https://www.jianshu.com/p/6efe2c76a2dd

JAVA流程控制学习总结

1、块作用域语句&#xff08;复合语句&#xff09;即用一对花括号将若干语句括起来&#xff0c;目的是从语法上将多条语句解释为一条语句。这里要注意一点&#xff0c;java语言中块作用域语句可以嵌套&#xff0c;但不可以在嵌套的两层中声明同名的变量。举个错误的例子&#x…

如何在MATLAB下把模糊推理系统转化为查询表(转载)

如何在MATLAB下把模糊推理系统转化为查询表(原创) http://foundy.blog.163.com/blog/static/2633834420090212202156/?modeedit 在SIMULINK里把模糊逻辑生成查寻表&#xff08;原创&#xff09; http://foundy.blog.163.com/blog/static/2633834420100150439615/ 转载于:ht…

对SPA(单页面应用)的总结

目录 1、单页面应用&#xff08;SPA&#xff09;的概念&#xff1a;2、作用&#xff08;好处&#xff09;3、缺点4、实现SPA1、单页面应用&#xff08;SPA&#xff09;的概念&#xff1a; 1、single-page application是一种特殊的Web应用。它将所有的活动局限于一个Web页面中&a…

Linux运维:现状、入门和未来之路

今天想谈谈“运维”这一行&#xff0c;我将从以下五个部分来和大家分析一下目前Linux这个行业的现状以及如何学好Linux、成为专业运维人员和云服务对运维的影响。一、linux行业现状我们知道Linux诞生于1991年&#xff0c;它在国外的发展是非常迅速的&#xff0c;即使目前国内越…

wordpress 怎么获取站点标题

<?php $blog_title get_bloginfo(name); ?> 参考:https://zhidao.baidu.com/question/585555467971876845.html

CentOS安装Chrome

问题 在CentOS安装Chrome会遇到 libstdc.so.6(GLIBCXX_3.4.15)(64bit) 依赖失败的问题, 即使下载了最新的libstdc.so.6(包含GLIBCXX_3.4.15)也解决不了问题. Resolving Dependencies --> Running transaction check ---> Package google-chrome-beta.x86_64 0:35.0.1916.…

org.apache.hadoop.ipc.Client: Retrying connect to server

这个问题导致jps查看结点进程时发现找不到NodeManager或一段时间后消失&#xff0c;网上查找了很多博客&#xff0c;因hadoop版本不一样且出错的原因也可能不同&#xff0c;所以找了老半天。 步骤&#xff1a;jps --> 看logs中.log文件 --> 百度。 最后找到一个版本的博客…

转: RSA原理 阮一峰的博客

转&#xff1a;http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 讲的非常细致&#xff0c;易懂。