Android中Listview设置footerView后不展示的问题原因探究
2016-05-31 17:16
393 查看
Android中遇到了设置footerView后不展示,并且会把最后一个view当做footerview处理的情况。 上网搜索了下,说是把addFooterView放到setAdapter之前就可以了,作为一个开发者,怎么能不知其所以然呢,所以就大略的看了下listview的源码。 首先来看ListView的setAdapter源码:
if (mAdapter != null && mDataSetObserver != null) { mAdapter.unregisterDataSetObserver(mDataSetObserver); } resetList(); mRecycler.clear(;
if (mHeaderViewInfos.size() > 0 || mFooterViewInfos.size() > 0) { mAdapter = new HeaderViewListAdapter( mHeaderViewInfos, mFooterViewInfos, adapter); } else { mAdapter = adapter; }
主要看这里
if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);这里,此时由于我用的是xlistview,就是说此时我已经有了mHeaderViewInfos,但是没有footerinfo,于是会新建一个HeaderViewListAdapter,再进去HeaderViewListAdapter里面看一下源码:
public HeaderViewListAdapter(ArrayList<ListView.FixedViewInfo> headerViewInfos,ArrayList<ListView.FixedViewInfo> footerViewInfos,ListAdapter adapter) {mAdapter = adapter;mIsFilterable = adapter instanceof Filterable;if (headerViewInfos == null) {mHeaderViewInfos = EMPTY_INFO_LIST;} else {mHeaderViewInfos = headerViewInfos;}if (footerViewInfos == null) {mFooterViewInfos = EMPTY_INFO_LIST;} else {mFooterViewInfos = footerViewInfos;}mAreAllFixedViewsSelectable =areAllListInfosSelectable(mHeaderViewInfos)&& areAllListInfosSelectable(mFooterViewInfos);}从上面可以看出来如果我没有footerinfo,他会新建个空的list自己用,而不是用我传进去footerinfo,毕竟我传进去null嘛,这样就会出错的,所以选用了这种自己new个list的方式。也就是说,如果setAdapter的时候我们有了headerInfo(xlistview自己加的),而没有footerinfo,HeaderViewListAdapter就会自己新建个Arraylist当做数据源,然后回过头来,我们再来看addFooterView:
public void addFooterView(View v, Object data, boolean isSelectable) {final FixedViewInfo info = new FixedViewInfo();info.view = v;info.data = data;info.isSelectable = isSelectable;mFooterViewInfos.add(info);mAreAllItemsSelectable &= isSelectable;// Wrap the adapter if it wasn't already wrapped.if (mAdapter != null) {if (!(mAdapter instanceof HeaderViewListAdapter)) {
//此前有了mHeaderViewInfos,于是此处就不再执行了,于是mFooterViewInfos被抛弃了mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);}// In the case of re-adding a footer view, or adding one later on,// we need to notify the observer.if (mDataSetObserver != null) {mDataSetObserver.onChanged();}}}可以看到,此时如果adapter是空的话,不会做任何操作,从之前的分析看此后再调用setAdapter不会出任何问题,然后当我们再setAdapter之后调用addFooterView,此时adapter不是空,并且adapter也是HeaderViewListAdapter的实例,那么就不会对adapter做任何操作,也就是说,我们后add进去的footerview,由于之前有了headeview,ListView就不会再管了!这也是为什么我们后AddFooterView的时候不再有用的原因了。所以综上所述,我们可以得出结论,如果一个listview想要同时拥有headerview和footerview,那么一定要在setAdapter之前都进行了设置才可以,如果仅仅设置了一个,而另一个在setAdapter之后再加的话就不会有任何作用了!而我出现这个问题的原因是,我用的XListView会在初始化的时候自动添加HeaderInfo,所以就不可以在setAdapter之后再addFooterView了。解决方法就是,addFooterView和addHeaderView一定要在setAdapter之前调用。同理,如果先addFooterView了,再setAdapter,那么之后再addHeaderView也会出现同样的问题。
相关文章推荐
- 使用CMake进行android native开发
- android:configChanges="screenSize | orientation | keyboardHidden"
- Android自动化测试之Robotium学习(二)
- Android发送邮件到指定邮箱(可带附件)
- Android自动化测试之Robotium学习(一)
- Android精炼实用的基础框架分享[Agility]
- android 基础 json解析Gson
- 【转】Android中JNI的使用方法
- Android--从零单排系列(3)--文件读写的操作
- Android 5.0+ 自定义普通按钮的ripple波纹效果
- Android 6.0运行时权限
- Android应对进程被杀死--Service(二)
- 关于软件盘弹与不弹的问题
- Android跑马灯效果
- Android Bundle知识小梳理
- 在内部存储写文件
- 1.ormlite 学习笔记
- Android 上自定义的复式折线图(一)
- CameraPreView遇到的一些问题
- android service无法显示对话框的解决方案