本文参考:http://blog.csdn.net/androiddevelop/article/details/8474939

异常提示:Java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.

产生原因:addHeaderView()调用在setAdapter()之后,并且该代码运行在Android4.3之前的系统版本。Android SDK与API Level对应表

我们来看看(Android4.3)API-18 和 (Android4.2)API-17的Listview代码片段:

API-18

public void addHeaderView(View v, Object data, boolean isSelectable) {
02.        final FixedViewInfo info = new FixedViewInfo();
03.        info.view = v;
04.        info.data = data;
05.        info.isSelectable = isSelectable;
06.        mHeaderViewInfos.add(info);
07.
08.        // Wrap the adapter if it wasn't already wrapped.
09.        if (mAdapter != null) {
10.            if (!(mAdapter instanceof HeaderViewListAdapter)) {
11.                mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);
12.            }
13.
14.            // In the case of re-adding a header view, or adding one later on,
15.            // we need to notify the observer.
16.            if (mDataSetObserver != null) {
17.                mDataSetObserver.onChanged();
18.            }
19.        }
20.}

API-17

public void addHeaderView(View v, Object data, boolean isSelectable) {
02.
03.        if (mAdapter != null && ! (mAdapter instanceof HeaderViewListAdapter)) {
04.            throw new IllegalStateException(
05.                    "Cannot add header view to list -- setAdapter has already been called.");
06.        }
07.
08.        FixedViewInfo info = new FixedViewInfo();
09.        info.view = v;
10.        info.data = data;
11.        info.isSelectable = isSelectable;
12.        mHeaderViewInfos.add(info);
13.
14.        // in the case of re-adding a header view, or adding one later on,
15.        // we need to notify the observer
16.        if (mAdapter != null && mDataSetObserver != null) {
17.            mDataSetObserver.onChanged();
18.        }
19.}

在API-17中,假如adapter不为空,则会直接抛出异常,而在API-18中则做了相关的优化。

再看一下setAdapter()方法部分源码:

 public void More ...setAdapter(ListAdapter adapter) {...此处省略部分代码...if (mHeaderViewInfos.size() > 0||                mFooterViewInfos.size() > 0) {mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);} else {mAdapter = adapter;}...此处省略部分代码...}

建议

按照正常的人逻辑:先添加header,在4.3以前版本,由于此时mAdapter = null,所以不会走抛异常逻辑。再设置adapter,此时看adapter的源码,此时的adapter成为了HeaderListAdapter了,我们在此时可以移除掉header。

等在访问网络成功之后,再去添加header,此时走进addHeader的源码,虽然if语句中mAdapter!=null条件满足,但是后面条件mAdapter已经是HeaderListAdapter类型了,条件不满足,也不会走抛异常逻辑。此时就是可行的。

总结:先添加header或者footer,在setAdapter之后再移除掉header或者footer。在访问网络成功之后,再去添加header或者footer即可。

ListView setAdapter has already been called 异常相关推荐

  1. ListView.setAdapter(adapter);空指针异常的解决的总结

    ListView.setAdapter(adapter);空指针异常的解决的总结 参考文章: (1)ListView.setAdapter(adapter);空指针异常的解决的总结 (2)https: ...

  2. ListView、AdapterView、RecyclerView全面解析

    原文链接:http://blog.csdn.net/carson_ho/article/details/51472640 AdapterView简介 AdapterView本身是一个抽象类,Adapt ...

  3. Android 系统(188)---Android开发:ListView、AdapterView、RecyclerView全面解析

    Android开发:ListView.AdapterView.RecyclerView全面解析 目录 ListView.AdapterView.RecyclerView全面解析.png Adapter ...

  4. listview的简单实现

    1.listView的xml 2.listVIew的每各Item的布局xml 3.创建一个adapter继承BaseAdapter 4.将数据绑定到视图    adapter的代码样例: public ...

  5. java 线程 listview_android使用Thread实现json数据的传递,并且使用ListView显示

    分类: Android平台 2014-03-06 17:06:56 在android 4.0以后,不能在主线程中使用网路资源.所以对于使用json传递的数据,我们要用它直接生成Listview会报一个 ...

  6. android学习笔记----ListView和各种适配器简介

    学习笔记 目录 打气筒(LayoutInflater对象)介绍: ArrayAdapter用法: 关于具有自定义 ArrayAdapter 的示例应用见这里: SimpleAdapter用法: 关于L ...

  7. 13.ListView和GridView

    转载请标明出处:  http://blog.csdn.net/yujun411522/article/details/46226001 本文出自:[yujun411522的博客] android组件中 ...

  8. Android ListView 点击item改变item的背景颜色(ListView实现光标移动)

    一下demo 地址 实现的效果图如下 ListView 光标移动,实现很是简单,这里是指item背景的改变 使用 listSelector listSelector  用户指定当前选中item 的颜色 ...

  9. Android ListView 删除 item

    实现效果 主要使用方法 是, remove 之后在刷新界面 adapter 里面的代码 public class MyAdapter extends BaseAdapter {private List ...

最新文章

  1. selenium+python headless 爬虫环境配置
  2. JAVA正则忽略大小写
  3. java常用注解及功能_SpringBoot 中常用注解及各种注解作用
  4. Python带下划线的变量或函数命名详细介绍
  5. C++shell sort希尔排序的实现算法之一(附完整源码)
  6. IE下 c00ce56e 错误竟然是nginx 字符设置的问题
  7. oracle-group by -having
  8. 虚拟鼠标代替安卓触屏_美术学院18级虚拟空间设计专业数字图像程序基础课程优秀结课成果展示优秀学生王雨禾作品展示...
  9. 程序员专属精品简历合集—面试必备
  10. 刘强东宣布向瑞士捐赠160万只口罩及其他大量急需医疗物资
  11. openmv探索_4_AprilTag标记追踪
  12. 离散数据:析取范式与合取范式
  13. 关于Olly Dbg的使用报告
  14. 挺苹果的声音,iPhone 5s的两处进步
  15. centos7设置Java服务开机自启
  16. Windows7下Foxmail不能使用问题解决一例
  17. 小白入门---HTML5音乐播放器
  18. GFP_ATOMIC or GFP_KERNEL 区别
  19. 纹理过滤函数glTexParameteri
  20. Augment Reality(AR)现实增强的原理

热门文章

  1. 从反汇编的角度看C++语法(构造函数)
  2. 数据分析-分类评价-PR与ROC曲线
  3. 子串查找(Hash)
  4. js创建对象的方法总结
  5. router route
  6. MATLAB 两椭圆重合面积的填充与计算
  7. python手机怎么下载软件_python利器app下载-python利器手机版 _5577安卓网
  8. 使用python获取股票指定日期交易代码数据
  9. 怎么使计算机软件运行快w10,w10怎么优化开机速度_w10优化开机速度的方法
  10. 基于jeecgboot的flowable流程支持定时捕获事件