Android ListView的addHeaderView与addFooterView的详解

在Android开发中ListView是一个使用广泛的控件,ListView在开发中和其它组件组合起来可以做出一系列优美的效果!今天主要随意写写,ListView中的addHearView()和addFooterView()在使用中应该注意的一些问题。

    1.addHeaderView()的功能是在ListView的头部添加一个布局,它可以重复添加多个布局。同理,addFooterView()是在ListView的底部添加一个布局。但是在添加布局的时候它是从父容器开始添加的,而不可以单独添加某个父容器中的某个子控件。比如:你可能只是单独添加一个ImageView在ListView的顶部展示一张图片。那么你也只能单独写个xml布局里面就放个ImageView,然后将整个View添加进去。或者说:你就只要添加一个空白的View放上面占个位置,你也不能省事。你还是得这样写:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        
        <View
            android:layout_width="match_parent"
            android:layout_height="50dp"/>
     
    </LinearLayout>

    View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.head_view_layout, null);
    mListView.addHeaderView(view);

     2.在addHeaderView()与addFooterView()时,它们各有一个重载方法addHeaderView(View v,Object data,boolean isSelectable)与addFooterView(View v,Object data,boolean isSelectable)。它们相对应addHeaderView()与addFooterView而言,主要在于最后一个参数isSelectable可以控制你添加进去的View是否可以被selected.

     3.在addHeaderView()与addFooterView()时,它们必须在你setAdapter()之前就添加进去,这样才能绑定头部或尾部,不然会报错!这是因为在调用setAdapter()的时候,android会判断是否添加了头部或者尾部,如果你添加了,它会生成一个新的tempadapter,这个新的tempadapter包含了我们设置的适配器所有的内容,包括了添加的headerView和footerView。所以当我们再给ListView添加了header或footer后在程序中调用ListView.setAdapter时返回的tempAdapter就不是我们setAdapter()进去的adapter了。在添加了header后,我们的adapter的position虽然是从0开始计算的,但是0的位置已经被header占用了,所以在调用public void onItemClick(AdapterView<?> parent,View view,int position,long id)这个方法的时候,我们ListView的点击事件取值时,position-1时才能取到正确的值。

     4.在ListView的item中如果有Button,CheckBox等控件时,item的焦点会被里面的Button,CheckBox等抢走,造成item点击事件失效的情况。这种情况的解决方案就是要么你把里面的这种抢焦点的控件,换成ImageView这种不抢焦点的控件去实现相同的效果。要么setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);这样就能阻塞子控件抢占焦点,item能触发点击事件,里面的Button,Checkbox也能触发各自的点击事件。

     5.在我们实际开发中,一般我们都是先setAdapter()然后在removexxx()相应的控件,尤其是在动态添加和删除的时候。不然会出现出现空指针异常。可能你会觉得很奇怪,为啥我的ListView的数据不为空,它会出现空指针异常!这是因为ListView它是分成三部分的,头部,中间,尾部;其中要有中间才能真正意义上的生效,如果,中间部分没有设置进去还没生效,你就进行移除它肯定会出去空指针的。在移除前一定要记得setAdapter(),adapter 不能为null。
---------------------
作者:丶咸鱼
来源:CSDN
原文:https://blog.csdn.net/richardli1228/article/details/48551639
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值