情景: 有两个分类,每个分类下的数据用listview显示,分类1需要显示头视图和尾视图,分类2不要显示头视图和尾视图 。两个分类可以来回切换。

实现的步骤: 1. addHeaderView 、 addFooterView,默认显示分类1的数据,setAdapter绑定 

2. 点击分类2时,先removeheaderview、removefooterview,然后setAdapter重新绑定数据

3. 点击分类1时,addHeaderView、addFooterView,然后setAdapter重新绑定数据

修改之前的代码:

   public void addHeaderFooter(){
if(!hasHead){
listview.addHeaderView(tv_head);
hasHead = true;
}
if(!hasFoot){
listview.addFooterView(tv_foot);
hasHead = false;
}
}
@Override
public void onClick(int position) {
Log.d(TAG, "position " + position + " is clicked!");
switch(position){
case 1:
//不需要header和footer
if(hasHead){
listview.removeHeaderView(tv_head);
hasHead = false;
}
if(hasFoot){
listview.removeFooterView(tv_foot);
hasFoot = false;
}
break;
default:
//其余分类都需要
addHeaderFooter();
break;
}

遇到的问题: 

步骤3中addHeaderView时报错:

解决办法:

add之前, setAdapter(null).

查看源码可知:

将adapter置null后,就不会报错了



这样改之后又遇到了一个问题:

步骤3中addFooterView时报错:

追踪源码可知:

此处getAdapter为null(之前调用了setAdapter(null)),所以nullpointer了

为什么会走到这一步呢,查看addFooterView的源码:

调用了mDataSetObserver.onChanged(),

而这个 mDataSetObserver 在哪里呢?见setAdapter源码:

原来,在步骤1中调用了setAdapter设置数据,所以这里的mDataSetObserver就存在了。

所以在setAdapter(null)之后,调用addFooterView时,由于mDataSetObserver依然存在,就会调用mDataSetObserver.onChanged()方法,从而调用getAdapter方法,返回null,再调用getcount时就nullpointer了。

解决办法: 我是在addFooterView之前又绑定了一次,setAdapter,给了一个空的数据源进去,只是确保adapter不为null。 这个方法有点投巧,没找到好的方法。



改正后的代码:

public void addHeaderFooter(){
listview.setAdapter(null);
if(!hasHead){
listview.addHeaderView(tv_head);
hasHead = true;
}
if(!hasFoot){
SimpleAdapter adapter = new SimpleAdapter(this, empty_list, R.layout.funtest_listview_item,
new String[]{ FuntestColumns.name,FuntestColumns.r_count,FuntestColumns.description},
new int[]{R.id.funtest_name, R.id.funtest_hot, R.id.funtest_description});
listview.setAdapter(adapter);
listview.addFooterView(tv_foot);
hasHead = false;
}
}
@Override
public void onClick(int position) {
Log.d(TAG, "position " + position + " is clicked!");
switch(position){
case 1:
//不需要header和footer
if(hasHead){
listview.removeHeaderView(tv_head);
hasHead = false;
}
if(hasFoot){
listview.removeFooterView(tv_foot);
hasFoot = false;
}
break;
default:
//其余分类都需要
addHeaderFooter();
break;
}

总结: 多次调用addHeaderView、addFooterView时

1. addHeaderView之前调用setAdapter(null)

2. addFooterView之前调用setAdapter(adapter); //adapter中传入空数据源

问题解决:listview多次调用addHeaderView和addFooterView的更多相关文章

  1. Android listview addHeaderView 和 addFooterView 详解

    addHeaderView()方法:主要是向listView的头部添加布局addFooterView()方法:主要是向listView的底部添加布局 需要注意的是添加布局的时候应该添加从父容器开始添加 ...

  2. RecyclerView更通用——listView的onItemClick,onLongItemClick,addHeaderView,addFooterView

    一.点击事件 setOnItemClickListener,setOnItemLongClickListener RecyclerView中虽然没有提供上面这两个接口,但是给我们提供了另外一个接口:O ...

  3. ListView在列表的头部和底部添加布局——addHeaderView,addFooterView

    addHeaderView()方法:主要是向listView的头部添加布局addFooterView()方法:主要是向listView的底部添加布局 以addHeaderView为例: View he ...

  4. android listview addHeaderView和addFooterView的注意事项

    1. item内如果有button等控件时,在监听listview的onitemclick事件时,焦点会被item内的button. imagebutton等控件抢走,从而导致在listview设置了 ...

  5. Android 关于ListView中adapter调用notifyDataSetChanged无效的原因

    话说这个问题已经困扰我很久了,一直找不到原因,我以为只要数据变了,调用adapter的notifyDataSetChanged就会更新列表,最近在做微博帐号管理这一块,想着动态更新列表,数据是变了,但 ...

  6. android ListView 多次调用 getView方法

    <ListView            android:layout_width="match_parent"            android:layout_heig ...

  7. Android开发之关于ListView中adapter调用notifyDataSetChanged无效的原因

    1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. 3.数据源更新了,但是adpter没有 ...

  8. C# winfrom listview 多窗口调用

    Form1 private void button1_Click(object sender, EventArgs e) { Form f = new Form2(ref listView1); f. ...

  9. 【Android - 自定义View】之自定义可下拉刷新或上拉加载的ListView

    首先来介绍一下这个自定义View: (1)这个自定义View的名称叫做 RefreshableListView ,继承自ListView类: (2)在这个自定义View中,用户可以设置是否支持下拉刷新 ...

随机推荐

  1. MySQL5.6 community从下载到安装

    一, 官网下载: https://www.mysql.com/downloads/      二, 安装过程 1, 双击打开 安装 这里是进行数据库配置: 端口默认为3306 这里我们更改为1207 ...

  2. 新手redis集群搭建

    redis集群搭建在开始redis集群搭建之前,我们先简单回顾一下redis单机版的搭建过程 下载redis压缩包,然后解压压缩文件:进入到解压缩后的redis文件目录(此时可以看到Makefile文 ...

  3. CCA Spark and Hadoop 开发者认证技能点【2016只为hadoop达到巅峰】

    Required Skills 技能要求: Data Ingest 数据消化: The skills to transfer data between external systems and you ...

  4. Ionic 图片预览ion-slide-box,ion-slide,ion-scroll实现

    1.index.html 代码 <body ng-app="starter"> <ion-pane> <ion-header-bar class=&q ...

  5. 90 k数和 II

    原题网址:https://www.lintcode.com/problem/k-sum-ii/description 描述 Given n unique integers, number k (1&l ...

  6. Vue.之.回到顶部

    Vue.之.回到顶部 当页面出现上下滚动条时,页面右下角出现回到顶部功能. 在页面上添加如下DIV(写的CSS内部样式),这个DIV功能:出现滚动条往下滑动,就显示出来,反之隐藏.点击DIV快速回到顶 ...

  7. jdk 数组位移运算

    1.采用先shift=31-Integer.numberOfLeadingZeros(scale);取int前面的补零个数31再减去拿到占得内存位长度 2.i偏移shift(其实等于I*位数) 加上b ...

  8. hive-hbase性能问题

    华为负责人本来想用这种表来做大数据开发,先前就听前辈讲过性能存在问题.实际开发过程确实存在不少问题.然后放弃换方案去做了. 1.底层meta映射字段问题.默认4000,如果再做修改会涉及到挺多源码. ...

  9. Web调取摄像头拍照

    调取摄像头.拍照 <!doctype html> <html lang="en"> <head> <meta charset=" ...

  10. JAVA面试常见问题之设计模式篇

    1.常见的设计模式 单例模式.工厂模式.建造模式.观察者模式.适配器模式.代理模式.装饰模式. 参考:https://www.cnblogs.com/cr330326/p/5627658.html 2 ...