Android 4.4以下ListView addHeader和addFooter放在setAdapter之后导致异常的原因分析和解决
来源:互联网 发布:编程需要哪些基础知识 编辑:程序博客网 时间:2024/06/05 06:15
问题重现:
在Android 19之前,ListView的addHeader和addFooter必须在setAdapter之前调用,否则就会有异常,Android 19以及之后是没有这个问题的。异常的具体表现为:
1.在setAdapter之后调用mListView.addHeaderView(mHeader);会抛出异常: Cannot add header view to list -- setAdapter has already been called.
2.在setAdapter之后调用mListView.addFooterView(mFooter);虽然不会抛出异常,但是却看不到添加的footer。
问题解决:
在Android 19之前,如果想在setAdapter之后添加header和footer,可以这样做:
//设置adapter之后设置header和footer ListAdapter originalAdapter; //得到之前给listview设置的adapter,如果已经知道,可以不用 if (mListView.getAdapter() instanceof HeaderViewListAdapter) { HeaderViewListAdapter headerViewListAdapter = (HeaderViewListAdapter) mListView.getAdapter(); originalAdapter = headerViewListAdapter.getWrappedAdapter(); } else { originalAdapter = mListView.getAdapter(); } mListView.setAdapter(null); mListView.addHeaderView(mHeader); mListView.addFooterView(mFooter); mListView.setAdapter(originalAdapter);
问题原因
我们可以对比Android 18和19的ListView的源码,在addHeaderView的改变:
- API 18
public void addHeaderView(View v, Object data, boolean isSelectable) { if (mAdapter != null && ! (mAdapter instanceof HeaderViewListAdapter)) { throw new IllegalStateException( "Cannot add header view to list -- setAdapter has already been called."); } FixedViewInfo info = new FixedViewInfo(); info.view = v; info.data = data; info.isSelectable = isSelectable; mHeaderViewInfos.add(info); // in the case of re-adding a header view, or adding one later on, // we need to notify the observer if (mAdapter != null && mDataSetObserver != null) { mDataSetObserver.onChanged(); }}
- API 19
public void addHeaderView(View v, Object data, boolean isSelectable) { final FixedViewInfo info = new FixedViewInfo(); info.view = v; info.data = data; info.isSelectable = isSelectable; mHeaderViewInfos.add(info); // Wrap the adapter if it wasn't already wrapped. if (mAdapter != null) { if (!(mAdapter instanceof HeaderViewListAdapter)) { mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter); } // In the case of re-adding a header view, or adding one later on, // we need to notify the observer. if (mDataSetObserver != null) { mDataSetObserver.onChanged(); } }}
可以看到,在Android 19之前,如果ListView设置过Adapter,会抛出异常,在Android 19中,google做了调整。
0 0
- Android 4.4以下ListView addHeader和addFooter放在setAdapter之后导致异常的原因分析和解决
- RecyclerView添加addHeader和addFooter方法
- Listview添加头和尾,addHeader,addFooter,以及利用尾显示更新过程
- android中listview的setAdapter()和getAdapter()
- Android - ListView在setAdapter()后,getChildCount总是0的原因
- 关于listview的setAdapter和notifyDataSetChanged
- 关于listview的setAdapter和notifyDataSetChanged
- ListView的addfooter没显示footer的原因之一
- 解决listView.setAdapter()出现空指针异常
- Android Listview addHeaderView setadapter的时候莫名NullPointerException 解决
- 从源码上分析ListView的addHeaderView和setAdapter的调用顺序
- Android 在ListView使用addHeader注意的问题
- Android 在ListView使用addHeader注意的问题
- 联合查询时过滤条件放在ON之后和放在WHERE之后的区别
- ListView的addHeaderView和setAdapter的调用顺序
- listview在setadapter之后如果立马获取getchildcount则是为0的
- 在Android的TableLayout布局中,column和span属性“失效”原因分析与解决
- android:theme和app:popupTheme的作用,以及在android 3.0以下不起作用问题的解决
- [ios专项]Xcode 常见错误/警告,处理方法 (持续更新ing.._20140601)
- 微信小程序源码大集005----微信小程序开发之视频播放器带弹幕Video弹幕颜色自定义(有图有源码)
- LVS 原理(调度算法、四种模式的实现、四层负载均衡和七层 的区别)
- 第90课:Hive中电影评价系统案例数据建模、数据过滤、Join多表关联、Map端Join、原理剖析等
- go 内置函数
- Android 4.4以下ListView addHeader和addFooter放在setAdapter之后导致异常的原因分析和解决
- ds 6.2 expectation
- Jqeury easyui 日积月累的拓展应用
- zabbix 通过python脚本将报警信息发送到rabbitMQ
- nodejs跨域问题解决方案
- Tomcat启动时SecureRandom超级慢的问题
- Git 上传到github
- 自动化 Code Review
- android64k(方法书超限)