Android ListView中headerview的动态显示和隐藏的实现方法

1.动态设置headerview的方法
动态设置headerview有两个思路。
方法一
将header的布局写在list item的布局文件中,在adapter中通过判断position的值是否为0动态控制其显示或隐藏。
代码示例:
item.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/item_selector"
android:gravity="center_vertical"
android:orientation="vertical" >
<include
android:id="@+id/view_header"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
layout="@layout/view_header"
android:visibility="gone" />
<LinearLayout
android:id="@+id/view_item"
android:layout_width="match_parent"
android:layout_height="67dip"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:orientation="horizontal" >
...
</LinearLayout>
</LinearLayout>
item.xml中主要分为两个部分,上面的view_header是头header的布局,下面的view_item是普通item的布局,具体的布局内容这里省略了。然后在 MyListViewAdapter.Java的getView方法中处理header的显示问题,如果position为0,则显示header,隐藏普通的item。如果position大于0,则隐藏header,隐藏普通item。
@Override
public View getView(int position, View convertView, ViewGroup parent)
...
if (position == 0) {
holder.mHeader.setVisibility(View.VISIBLE);
holder.mItem.setVisibility(View.GONE);
initHeaderView(convertView);
} else {
holder.mItem.setVisibility(View.VISIBLE);
holder.mHeader.setVisibility(View.GONE);
initNormalView(convertView);
}
return convertView;
以此扩展,若有两钟不同的headview,则新加一个判断条件:
if (position == 0) {
holder.mHeader.setVisibility(View.VISIBLE);
holder.mHeader2.setVisibility(View.GONE);
holder.mItem.setVisibility(View.GONE);
initHeaderView(convertView);
} else if(position == 1){
holder.mHeader.setVisibility(View.GONE);
holder.mHeader2.setVisibility(View.VISIBLE);
holder.mItem.setVisibility(View.GONE);
initHeaderView2(convertView);
}else {
holder.mItem.setVisibility(View.VISIBLE);
holder.mHeader.setVisibility(View.GONE);
holder.mHeader2.setVisibility(View.GONE);
initNormalView(convertView);
}
方法二
使用listview提供的addHeaderView
为了动态显示和隐藏header,按照惯例,误以为直接通过setVisibility中的View.GONE就可以实现。但是在实际使用中发现并不是这样的。例如:
private View mHeader; mHeader = LayoutInflater.from(this).inflate(R.layout.header, null); //加载footer的布局 mListView.addHeaderView(mHeader);
如果想动态隐藏这个header,惯性思维是直接设置header为gone:(其实这样做是不对的)
mHeader.setVisibility(View.GONE); //隐藏header
实际上,直接设置GONE后,虽然元素是隐藏了,但是还是占用着那个区域,此时和View.INVISIBILE效果一样。
解决办法是,在header布局文件的最外层再套一层LinearLayout/RelativeLayout,这里称为headerParent。隐藏时隐藏mHeader,而不是headerParent。
view_header.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mHeaderparent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFFFFF"
android:gravity="center"
android:orientation="vertical"
>
<LinearLayout
android:id="@+id/mHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
...
</LinearLayout>
</LinearLayout>
加载header和headerParent的布局:
MainActivity.java中关键代码展示
private View mHeader; //header private View mHeaderParent; //header的最外面再套一层LinearLayout mHeaderParent = LayoutInflater.from(getActivity()).inflate(R.layout.headerparent_listview, null);//加载footerParent布局 mHeader = mHeaderParent.findViewById(R.id.header); listView.addHeaderView(mHeaderParent); //把mHeaderParent放到ListView当中 mHeaderParent.setOnClickListener(MainActivity.this);
设置header为gone:(不是设置headerParent为gone)
mHeader.setVisibility(View.GONE);
该方法有一点需要注意的是:listView.addHeaderView()方法必须在setAdapter()方法前调用,否则就会抛异常。
ListView listView = xxxx; listView.addHeaderView(mHeaderParent); listView.setAdapter(adapter); mHeader.setVisibility(View.GONE);
以上两种方法各有优劣,个人倾向于第二种方法,第一种的耦合性太强了,并且由于将header布局与普通item布局合在一起,另外每次显示时额外增加了一次position的条件判断,在性能上有些额外的消耗。
2.引入headerview带来的问题
当引入headerview之后,可能会引起OnItemClickListener的position移位问题。
position通常是从0开始的,但是添加了HeaderView之后,position也会将HeaderView的数目计算进去。
这里提供以下两种解决办法:
(1).手动计算真实的position位置:
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已经为我们提供了数据的绑定:
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Item item = parent.getAdapter().getItem(position);
}
});
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# ListView中headerview的动态显示和隐藏的问题解决办法
# ListView
# 中headerview
# 的显示和隐藏
# Android实现listview动态加载数据分页的两种方法
# android ListView内数据的动态添加与删除实例代码
# android动态布局之动态加入TextView和ListView的方法
# Android实现Listview异步加载网络图片并动态更新的方法
# Android编程实现动态更新ListView的方法
# Android开发之利用ListView动态刷新某个Item
# Android listview动态加载列表项实现代码
# Android实现ListView数据动态加载的方法
# Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)
# Android ListView中动态显示和隐藏Header&Footer的方法
# Android开发中Listview动态加载数据的方法示例
# 两种
# 加载
# 解决办法
# 的是
# 就会
# 是这样
# 如有
# 是从
# 希望能
# 这样做
# 各有
# 种方法
# 若有
# 谢谢大家
# 会将
# 写在
# 绑定
# 需要注意
# 第一种
# 倾向于
相关文章:
,怎么用自己头像做动态表情包?
怎么将XML数据可视化 D3.js加载XML
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
测试制作网站有哪些,测试性取向的权威测试或者网站?
如何在Ubuntu系统下快速搭建WordPress个人网站?
5种Android数据存储方式汇总
已有域名如何快速搭建专属网站?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
代购小票制作网站有哪些,购物小票的简要说明?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
如何在阿里云ECS服务器部署织梦CMS网站?
兔展官网 在线制作,怎样制作微信请帖?
定制建站价位费用解析与套餐推荐全攻略
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
建站之星ASP如何实现CMS高效搭建与安全管理?
建站之星代理平台如何选择最佳方案?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
免费视频制作网站,更新又快又好的免费电影网站?
PHP正则匹配日期和时间(时间戳转换)的实例代码
建站主机与虚拟主机有何区别?如何选择最优方案?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
如何高效配置香港服务器实现快速建站?
建站之星后台密码如何安全设置与找回?
建站之星安装提示数据库无法连接如何解决?
如何用wdcp快速搭建高效网站?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站之星如何实现网站加密操作?
如何用y主机助手快速搭建网站?
建站之星在线客服如何快速接入解答?
山东云建站价格为何差异显著?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
如何彻底卸载建站之星软件?
如何通过建站之星自助学习解决操作问题?
手机网站制作与建设方案,手机网站如何建设?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
建站之星会员如何解锁更多建站功能?
小建面朝正北,A点实际方位是否存在偏差?
制作门户网站的参考文献在哪,小说网站怎么建立?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
,在苏州找工作,上哪个网站比较好?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
如何用已有域名快速搭建网站?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
如何在橙子建站中快速调整背景颜色?
存储型VPS适合搭建中小型网站吗?
如何选择网络建站服务器?高效建站必看指南
*请认真填写需求信息,我们会在24小时内与您取得联系。