您的位置:首页 > 其它

ListView的addHeaderView与addFooterView的详解

2015-09-18 20:54 323 查看
在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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: