Android中Listview设置footerView后不展示的问题原因探究

原创 2016年05月31日 17:16:54
    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也会出现同样的问题。

Android ListView的addHeaderView与addFooterView的详解

在Android开发中ListView是一个使用广泛的控件,ListView在开发中和其它组件组合起来可以做出一系列优美的效果!今天主要随意写写,ListView中的addHearView()和add...
  • richardli1228
  • richardli1228
  • 2015年09月18日 20:54
  • 6797

【我的Android进阶之旅】如何去除ListView中Header View、Footer View中的分割线

最近的项目中给ListView 加入了一个Header View之后,发现Header View的下方也有了分割线,很难看,UI要求将Header View的分割器去掉,好吧。现在就来说一说如何如何去...
  • qq446282412
  • qq446282412
  • 2016年10月07日 15:25
  • 3307

在ListView的后面添加View

ListView是一个在Android当中十分重要的一个组件。大部分的APP都要利用到ListView这个组件,而在这个组件当中,若你使用的是线性布局(LinearLayout)则是无法在xml中定义...
  • a591243801
  • a591243801
  • 2017年05月25日 20:00
  • 700

Android在布局中动态添加view的两种方法

一、说明 添加视图文件的时候有两种方式:1、通过在xml文件定义layout;2、java代码编写二、前言说明1.构造xml文件2.LayoutInflater提到addview,首先要了解一下La...
  • Xd_Yu
  • Xd_Yu
  • 2016年05月19日 17:30
  • 16836

Android开发 使ListView的HeaderView和FooterView不可选择点击

在ListView里,HeaderView和FooterView也占一行,与其他的item一样,可以点击,有索引,HeaderView的索引为0.如果要使这两项不可点击,可以使用下面的方法: pub...
  • wjyyxzzjnws
  • wjyyxzzjnws
  • 2015年09月14日 00:49
  • 971

Android UI设计--ListView的页脚(footer)的使用

有时候使用ListView显示一些数据时,希望在列表项的尾部增加一个页脚(注:不是放在屏幕的最低端),页脚会随着ListView的数量的增加而自动跟随,由于ListView在数量超过屏幕显示的数量的时...
  • bfboys
  • bfboys
  • 2016年09月22日 15:02
  • 476

ListView不能直接用addView()方法直接装载控件吗?

ListView是必须要通过适配器来装载控件吗? TextView tv = new TextView(); list.addView(tv); 这样做不行? 答案如下: ListView的...
  • wubai250
  • wubai250
  • 2012年09月10日 17:14
  • 6618

ListView中addHeaderView()和addFootView细节,带案例代码

要实现类似IMBd类似的布局。   可以看出它的列表上方的图片展示区和下面列表条目是一体的,在上下滚动的时候。而图片展示区不是列表条目。 当然可以分别实现,图片展示区用Gallery,下...
  • lanxingfeifei
  • lanxingfeifei
  • 2016年09月08日 10:57
  • 2155

给listView添加headView或footView不显示的问题

问题描述今天发现使用listView的一个问题,当我们给listView添加headView或footView的时候,如果我们没给listView设置adapter或者给listView设置的空的ad...
  • ydxlt
  • ydxlt
  • 2015年08月29日 21:10
  • 2898

Android开发:listview的addFooterView失效情况记录

今天在给listview添加footerView的时候,发现怎么都无法添加成功,也没有报错,以下是我的代码: loadingFooter = inflater.inflate(R.layout.l...
  • weidongjian
  • weidongjian
  • 2014年11月26日 16:09
  • 1043
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中Listview设置footerView后不展示的问题原因探究
举报原因:
原因补充:

(最多只允许输入30个字)