ListView setAdapter has already been called 异常
来源:互联网 发布:恢复手机联系人软件 编辑:程序博客网 时间:2024/05/17 23:06
一 遇到问题
ListView HeaderView使用过程中遇到的问题
1. 必须在setAdapter之前执行addHeaderView方法,否则会出现以下异常
java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.
二 分析源码查找原因
先来看问题1,查看下ListView.addHeaderView()源码分析原因
public void addHeaderView(View v, Object data, boolean isSelectable) { // 只要mAdapter不为空就抛出此异常 if (mAdapter != null && ! (mAdapter instanceof HeaderViewListAdapter)) { throw new IllegalStateException( "Cannot add header view to list -- setAdapter has already been called."); } ...... }
再分析下问题2,查看ListView.setAdapter()源码分析原因
public void setAdapter(ListAdapter adapter) { ..... if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) { mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter); } else { mAdapter = adapter; } ..... }
原来使用了新的adapter
三 为什么HeaderView需要包装一个HeaderViewListAdapter?
为什么addHeaderView时adapter必须为空
1. 先来看下ListView的继承体系
ListView -> AbsListView -> AdapterView -> ViewGroup
2. ListView继承自ViewGroup,如果需要添加视图只能通过ViewGroup.addView()添加,而在AdapterView.addView中可以看到此方法已经不让使用
public void addView(View child) { throw new UnsupportedOperationException("addView(View) is not supported in AdapterView"); }
3. 只能通过adapter的getview处理添加view,ListView内部是如何添加View?以下是方法调用堆栈
AbsListView.onTouchEvent -> AbsListView.scrollIfNeeded -> AbsListView.trackMotionScroll -> AbsListView.fillGap -> ListView.fillDown/fillUp/fillFromMiddle -> ListView.makeAndAddView -> ListView.setupChild -> ListView.addViewInLayout
也可以在第一个item的布局中添加,但是这种方式会对ListView造成影响
转载请注明出处:http://blog.csdn.net/love_world_/article/details/8474939
2013-04-22 删除position引出的问题,拆分出一个独立的文章之前放到一起有点乱
- ListView setAdapter has already been called 异常
- ListView setAdapter has already been called 异常
- ListView setAdapter has already been called 异常
- addHeaderView()异常 —— setAdapter has already been called
- addHeaderView()异常 —— setAdapter has already been called
- addHeaderView()异常 —— setAdapter has already been called
- addHeaderView()异常 —— setAdapter has already been called
- addHeaderView()异常 —— setAdapter has already been called
- ListView "Cannot add header view to list -- setAdapter has already been called."
- Listview:Cannot add header view to list -- setAdapter has already been called
- ListView添加HeaderView出现Cannot add header view to list -- setAdapter has already been called.
- addHeaderView发生错误—— setAdapter has already been called.
- Cannot add header view to list -- setAdapter has already been called.
- Cannot add header view to list setAdapter has already been called
- Cannot add header view to list -- setAdapter has already been called.
- java.lang.IllegalStateException:Cannot add header view to list==setAdapter has already been called.
- Cannot add header view to list -- setAdapter has already been called
- java.lang.IllegalStateException:Cannot add header view to list==setAdapter has already been called.
- 阿里旺旺2012聊天获取(卖家版)
- 【转】杀人后一个孩子的做法…不看你会后悔的…
- [130106]阶段总结
- 对于CCRender 的打算
- 简单的单链表
- ListView setAdapter has already been called 异常
- 若梦醒来
- 遍历当前目录下所有的.h文件,并将其路径保存到文件中
- 举例android中说明把字符串中的标点符合去掉的方法
- Hadoop1.0.4单节点StandAlone及Pseudo-Distributed部署方法
- 黑马程序员--JSP中的九大内置对象
- bash的几个初始化文件浅析
- hibernate的数据库连接池技术
- java 的并发问题