ExpandableListView总结

作者: 陈利健 | 来源:发表于2015-01-15 00:37 被阅读1280次

    ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同的是,它可以有两层:每一层都能够被独立的展开并显示其子项。这些子项来自于与该视图关联的ExpandableListAdapter。

    每一个可以扩展的列表项的旁边都有一个指示符(箭头)用来说明该列表项目前的状态(这些状态一般是已经扩展开的列表项,还没有扩展开的列表项,子列表项和最后一个子列表项)。可以使用方法:setChildIndicator(Drawable),setGroupIndicator(Drawable)(或者相应的xml属性设置)去设置这些指示符的样式。当然也可以使用默认的指示符:android.R.layout.simple_expandable_list_item_1,android.R.layout.simple_expandable_list_item_2


    ExpandableListAdapter adapter = new BaseExpandableListAdapter();
    BaseExpandableListAdapter的主要重载方法如下:

    public abstract Object getChild (int groupPosition, int childPosition)
    //取得与指定分组、指定子项目关联的数据.
    参数:
    groupPosition   包含子视图的分组的位置.
    childPosition   指定的分组中的子视图的位置.(子视图中的子视图的位置,上面的那个子视图衍化成了一个组)
    返回:
    与子视图关联的数据.
    

    public abstract long getChildId (int groupPosition, intchildPosition)
    //取得给定分组中给定子视图的ID. 该组ID必须在组中是唯一的.必须不同于其他所有ID(分组及子项目的ID).
    参数:
    groupPosition    包含子视图的分组的位置,
    childPosition    要取得ID的指定的分组中的子视图的位置.
    返回:
    与子视图关联的ID.
    

    public abstract int getChildrenCount (int groupPosition)
    //取得指定分组的子元素数.
    参数:
    groupPosition   要取得子元素个数的分组位置.
    返回:
    指定分组的子元素个数.
    

    public abstract View getChildView (int groupPosition, intchildPosition, boolean   isLastChild, View convertView, ViewGroup parent)
    //取得显示给定分组给定子位置的数据用的视图.
    参数:
    groupPosition   包含要取得子视图的分组位置.
    childPosition   分组中子视图(要返回的视图)的位置.
    isLastChild     该视图是否为组中的最后一个视图.
    convertView     如果可能,重用旧的视图对象.使用前你应该保证视图对象为非空,并且是否是合适的类型.如果该对象不能转换为可以正确显示数据的视图,该方法就创建新视图.不保证使用先前由 getChildView(int, int,boolean, View, ViewGroup)创建的视图.
    parent          该视图最终从属的父视图.
    返回:
    指定位置相应的子视图.
    

    public abstract Object getGroup (int groupPosition)
    //取得与给定分组关联的数据.
    参数
    groupPosition 分组的位置.
    返回:
    指定分组的数据.
    

    public abstract int getGroupCount ()
    //取得分组数.
    返回:
    分组数.
    

    public abstract long getGroupId (int groupPosition)
    //取得指定分组的ID.该组ID必须在组中是唯一的.必须不同于其他所有ID(分组及子项目的ID).
    参数:
    groupPosition   要取得ID的分组位置.
    返回:
    与分组关联的ID.
    

    public abstract View getGroupView (int groupPosition, booleanisExpanded, View convertView, ViewGroup parent)
    //取得用于显示给定分组的视图. 这个方法仅返回分组的视图对象, 要想获取子元素的视图对象,就需要调用 getChildView(int, int, boolean, View, ViewGroup).
    参数:
    groupPosition  决定返回哪个视图的组位置 .
    isExpanded     该组是展开状态还是收起状态 .
    convertView    如果可能,重用旧的视图对象.使用前你应该保证视图对象为非空,并且是否是合适的类型.如果该对象不能转换为可以正确显示数据的视图,该方法就创建新视图.不保证使用先前由 getGroupView(int, boolean,View, ViewGroup)创建的视图.
    parent         该视图最终从属的父视图.
    返回:
    指定位置相应的组视图.
    

    public abstract boolean isChildSelectable (int groupPosition, intchildPosition)
    //指定位置的子视图是否可选择.
    参数:
    groupPosition   包含要取得子视图的分组位置.
    childPosition   分组中子视图的位置.
    返回:
    是否子视图可选择.
    

    通过覆写上面的方法,就可以根据需求创建一个BaseExpandableListAdapter对象了。

    再来说ExpandableListView:

    在XML布局文件中,如果ExpandableListView上一级视图的大小没有严格定义的话,则不能对ExpandableListView的android:layout_height 属性使用wrap_content值。 (例如,如果上一级视图是ScrollView的话,则不应该指定wrap_content的值,因为它可以是任意的长度。不过,如果ExpandableListView的上一级视图有特定的大小的话,比如100像素,则可以使用wrap_content)
    如果由于开发的时候粗心,对ExpandableListView指定wrap_content的值,则会报一个在SetContentView处的空指针错误。

    在实际开发过程中,常常有不同的需求,比如每一个child需要不同的控件,每一个group或者child需要有图标,图标显示需要不一样,需要设置背景等各种各样能够让我们的程序变得美观的需求。

    //举例1:为ExpandableListView设置背景,并且默认展开第n组,n从0开始计数,则只需要添加如下代码:
    myExpandableListView.setBackgroundResource(R.drawable.background);  
    myExpandableListView.expandGroup(0);  
    

    //举例2:改变每个组前面的图标,并且图标样式随着合拢和展开不同,则只需要在res/drawable目录下定义文件:Indicator.xml
    <selector xmlns:android="http://schemas.android.com/apk/res/android">   
    <item android:state_expanded="true" android:drawable="@drawable/right"/>   
    <item android:drawable="@drawable/down"></item>   
    </selector>  
    //在java文件中添加:myExpandableListView.setGroupIndicator(this.getResources().getDrawable(R.drawable.indicator));  
    

    其他属性设置
    android:childDivider
    来分离子列表项的图片或者是颜色。注:图片不会完全显示,分离子列表项的是一条直线
    android:childIndicator
    在子列表项旁边显示的指示符。注:可以是一个图片
    android:childIndicatorLeft
    子列表项指示符的左边约束位置。注:即从左端0位置开始计数,比如,假设指示符是一个图标,给定这个属性值为3dip,则表示从左端起3dip开始显示此图标。
    android:childIndicatorRight
    子列表项指示符的右边约束位置。注:表示右端到什么位置结束
    android:groupIndicator
    在组列表项旁边显示的指示符。注:可以是一个图片。
    android:indicatorLeft
    组列表项指示器的左边约束位置。注:表示左端从什么位置开始。
    android:indicatorRight
    组列表项指示器的右边约束位置。注:表示右端到什么位置结束。

    相关文章

      网友评论

        本文标题:ExpandableListView总结

        本文链接:https://www.haomeiwen.com/subject/ahlcxttx.html