转-ExpandableListAdapter

http://blog.csdn.net/x605940745/article/details/12099709

http://www.blogjava.net/jjshcc/archive/2012/02/29/371030.html

 

实现展开列ExpandableListView的三种方式之SimpleExpandableListAdapter实例

分类: Android从入门到精通 4791人阅读 评论(3) 收藏 举报

目录(?)[+]

实现可扩展展开列ExpandableListView的三种方式

    欢迎加入QQ交流3群:317874559

一是使用SimpleExpandableListAdpater将两个List集合包装成ExpandableListView
二是 扩展BaseExpandableListAdpter
三是使用simpleCursorTreeAdapter将Cursor中的数据包装成SimpleCuroTreeAdapter

SimpleExpandableListAdpater的几个构造函数说明

public SimpleExpandableListAdapter(Contextcontext,List<? extends Map<String, ?>> groupData, int groupLayout,String[]groupFrom, int[] groupTo,List<? extends List<? extends Map<String, ?>>> childData, int childLayout,String[]childFrom, int[] childTo)

第一个参数  应用程序接口 this
第二个父列List<?extends Map<String,Object>>集合 为父列提供数据
第三个参数  父列显示的组件资源文件
第四个参数  键值列表 父列Map字典的key
第五个要显示的父列组件id
第六个 子列的显示资源文件
第七个参数 键值列表的子列Map字典的key
第八个要显示子列的组件id

  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
  3. android:layout_width=“wrap_content”
  4. android:layout_height=“wrap_content”
  5. android:orientation=“horizontal” >
  6. <ImageView
  7. android:id=“@+id/image1”
  8. android:layout_width=“wrap_content”
  9. android:layout_height=“wrap_content” />
  10. <TextView
  11. android:id=“@+id/txt1”
  12. android:paddingLeft=“10dp”
  13. android:layout_width=“wrap_content”
  14. android:layout_height=“wrap_content” />
  15. </LinearLayout>
  1. <?xml version=“1.0” encoding=“utf-8”?>
  2. <TextView xmlns:android=“http://schemas.android.com/apk/res/android”
  3. android:id=“@+id/items”
  4. android:layout_width=“wrap_content”
  5. android:layout_height=“wrap_content” >
  6. </TextView>
  1. package com.android.xiong.expandablelistviewtest;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import android.app.Activity;
  7. import android.os.Bundle;
  8. import android.view.Menu;
  9. import android.widget.ExpandableListView;
  10. import android.widget.SimpleExpandableListAdapter;
  11. public class MainActivity extends Activity {
  12. /**
  13.      * 实现可扩展展开列ExpandableListView的三种方式 
  14.      * 一是使用SimpleExpandableListAdpater将两个List集合包装成ExpandableListView
  15.      * 二是 扩展BaseExpandableListAdpter
  16.      *  三是使用simpleCursorTreeAdapter将Cursor中的数据包装成SimpleCuroTreeAdapter
  17.      */
  18. private int[] images = { R.drawable.one, R.drawable.two, R.drawable.threee };
  19. private String[] names = { “腾讯”“百度”“阿里巴巴” };
  20. private String[][] childnames = { { “QQ”“微信”“手机卫士” },
  21.             { “百度地图”“百度视频”“PPS&奇艺” }, { “支付宝”“新郎微博”“高德地图” } };
  22. private ExpandableListView ep;
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26.         setContentView(R.layout.activity_main);
  27. //定义父列表项List数据集合
  28.         List<Map<String, String>> group = new ArrayList<Map<String, String>>();
  29. //定义子列表项List数据集合
  30.         List<List<Map<String, String>>> ss = new ArrayList<List<Map<String, String>>>();
  31. for (int i = 0; i < names.length; i++) {
  32. //提供父列表的数据
  33.             Map<String, String> maps = new HashMap<String, String>();
  34. // maps.put(“images”, images[i]);
  35.             maps.put(“names”, names[i]);
  36.             group.add(maps);
  37. //提供当前父列的子列数据
  38.             List<Map<String, String>> child = new ArrayList<Map<String, String>>();
  39. for (int j = 0; j < names.length; j++) {
  40.                 Map<String, String> mapsj = new HashMap<String, String>();
  41.                 mapsj.put(“tengxun”, childnames[i][j]);
  42.                 child.add(mapsj);
  43.             }
  44.             ss.add(child);
  45.         }
  46. /**
  47.          * 第一个参数  应用程序接口 this
  48.          * 第二个父列List<?extends Map<String,Object>>集合 为父列提供数据
  49.          * 第三个参数  父列显示的组件资源文件
  50.          * 第四个参数  键值列表 父列Map字典的key
  51.          * 第五个要显示的父列组件id
  52.          * 第六个 子列的显示资源文件
  53.          * 第七个参数 键值列表的子列Map字典的key
  54.          * 第八个要显示子列的组件id
  55.          */
  56.         SimpleExpandableListAdapter expand = new SimpleExpandableListAdapter(
  57. this, group, R.layout.images, new String[] { “names” },
  58. new int[] { R.id.txt1 }, ss, R.layout.txtitem,
  59. new String[] { “tengxun” }, new int[] { R.id.items });
  60.         ep = (ExpandableListView) findViewById(R.id.ep1);
  61.         ep.setAdapter(expand);
  62.     }
  63. @Override
  64. public boolean onCreateOptionsMenu(Menu menu) {
  65. // Inflate the menu; this adds items to the action bar if it is present.
  66.         getMenuInflater().inflate(R.menu.main, menu);
  67. return true;
  68.     }
  69. }

下面附上网上其余几种构造函数的解释

public SimpleExpandableListAdapter(Contextcontext,List<? extends Map<String, ?>> groupData, int groupLayout,String[]groupFrom, int[] groupTo,List<? extends List<? extends Map<String, ?>>> childData, int childLayout,String[]childFrom, int[] childTo)
构造函数
参数
context        与SimpleExpandableListAdapter关联的ExpandableListView的上下文。
groupData    一个Maps列表(List)。集合中的每个字典项与可折叠列表中的每个组元素一致。字典项提供了组元素包含的所有数据,并包含所有在”groupFrom”中指定的记录。
groupLayout  显示组元素的资源文件。该资源文件定义了如何显示组元素。该布局文件必须至少包括groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
groupFrom       一个键值列表。对应与组相关联的Map中的键值。
grouptTo          组View应当显示groupFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个groupFrom参数获得列元素的数据。
childData       一个Map列表的列表。外部列表中的每个实体对应一个组(按照组的位置编号)。在内部列表的每个实体对应某个组的子元素(按照子元素的位置编号)。该Map对应了子元素的数据。(按照childFrom数组中的值编号)。该Map包含了每个子元素的数据,并且应当包括所有在childFrom中指定的实体。
childLayout       显示子元素的资源文件。该资源文件定义了如何显示子元素。布局文件至少应该包括所有在childTo中定义的View。(即childTo中的view id数组必须都在该布局文件中找到)
childFrom        定义显示子元素的列名。该列名与childData中的子元素属性(字典键值)对应。
childTo      子View应当显示childFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个childFrom参数获得列元素的数据。
public SimpleExpandableListAdapter (Context context, List<? extends Map<String, ?>> groupData, int expandedGroupLayout, int collapsedGroupLayout, String[] groupFrom, int[] groupTo, List<? extends List<? extends Map<String, ?>>> childData, int childLayout, String[] childFrom, int[] childTo)
构造函数。
参数
context        与SimpleExpandableListAdapter关联的ExpandableListView的上下文。
groupData    一个Maps列表(List)。集合中的每个字典项与可折叠列表中的每个组元素一致。字典项提供了组元素包含的所有数据,并包含所有在”groupFrom”中指定的记录。
expandedGroupLayout          定义组展开时的View的XML资源布局。该布局文件应当至少包括所有在groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
collapasedGroupLayout          定义组折叠时的View的XML资源布局。该布局文件应当至少包括所有在groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
groupFrom       一个键值列表。对应与组相关联的Map中的键值。
grouptTo          组View应当显示groupFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个groupFrom参数获得列元素的数据。
childData         一个Map列表的列表。外部列表中的每个实体对应一个组(按照组的位置编号)。在内部列表的每个实体对应某个组的子元素(按照子元素的位置编号)。该Map对应了子元素的数据。(按照childFrom数组中的值编号)。该Map包含了每个子元素的数据,并且应当包括所有在childFrom中指定的实体。
childLayout       显示子元素的资源文件。该资源文件定义了如何显示子元素。布局文件至少应该包括所有在childTo中定义的View。(即childTo中的view id数组必须都在该布局文件中找到)
childFrom        定义显示子元素的列名。该列名与childData中的子元素属性(字典键值)对应。
childTo      子View应当显示childFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个childFrom参数获得列元素的数据。

public SimpleExpandableListAdapter(Contextcontext,List<? extends Map<String, ?>> groupData, int expandedGroupLayout, int collapsedGroupLayout,String[]groupFrom, int[] groupTo,List<? extends List<? extends Map<String, ?>>> childData, int childLayout, int lastChildLayout,String[]childFrom, int[] childTo)
构造函数。
参数
context  与SimpleExpandableListAdapter关联的ExpandableListView的上下文。
groupData  一个Maps列表(List)。集合中的每个字典项与可折叠列表中的每个组元素一致。字典项提供了组元素包含的所有数据,并包含所有在”groupFrom”中指定的记录。
expandedGroupLayout   定义组展开时的View的XML资源布局。该布局文件应当至少包括所有在groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
collapasedGroupLayout   定义组折叠时的View的XML资源布局。该布局文件应当至少包括所有在groupTo中所定义的View。(即groupTo中的View id数组必须都在该布局文件中找到)
groupFrom      一个键值列表。对应与组相关联的Map中的键值。
grouptTo   组View应当显示groupFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个groupFrom参数获得列元素的数据。
childData        一个Map列表的列表。外部列表中的每个实体对应一个组(按照组的位置编号)。在内部列表的每个实体对应某个组的子元素(按照子元素的位置编号)。该Map对应了子元素的数据。(按照childFrom数组中的值编号)。该Map包含了每个子元素的数据,并且应当包括所有在childFrom中指定的实体。
childLayout      显示子元素的资源文件。该资源文件定义了如何显示子元素。布局文件至少应该包括所有在childTo中定义的View。(即childTo中的view id数组必须都在该布局文件中找到)
lastChildLayout 定义每组中最后一个子元素的View资源布局情况。该布局文件应当至少包括所有在childTo中所定义的View。(即childTo中的View id数组必须都在该布局文件中找到)
childFrom       定义显示子元素的列名。该列名与childData中的子元素属性(字典键值)对应。
childTo       子View应当显示childFrom参数中的所有列数据。这些数据应当都用TextView来显示。列表中的前N个View从前N个childFrom参数获得列元素的数据。

 

 

 

<?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” >

    <ExpandableListView
        android:layout_width=”fill_parent”
        android:layout_height=”wrap_content”
        android:id=”@+id/ecpandable”
        />

</LinearLayout>

 

package cn.csdn.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class ExpandableListViewActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.expandable_layout);

        /**BaseExpandableListAdapter实现了ExpandableListAdapter*/
        ExpandableListAdapter adapter = new BaseExpandableListAdapter(){

/**———-定义数组——————————————————————-*/
            private int[] images = new int[]{
                    R.drawable.ic_launcher,
                    R.drawable.stop,
                    R.drawable.play
            }
;
            private String[] armTypes = new String[]{
                    “神族”,”虫族”,”人族”
            }
;
            private String[][] arms = new String[][]{
                    {“狂战士”,”龙骑士”,”黑暗圣堂”},
                    {“小狗”,”飞龙”,”自爆妃子”},
                    {“步兵”,”伞兵”,”护士mm”}
            }
;

/*===========组元素表示可折叠的列表项,子元素表示列表项展开后看到的多个子元素项=============*/

/**———-得到armTypes和arms中每一个元素的ID——————————————-*/

            //获取组在给定的位置编号,即armTypes中元素的ID
            @Override
            public long getGroupId(int groupPosition) {
                return groupPosition;
            }


            //获取在给定的组的儿童的ID,就是arms中元素的ID
            @Override
            public long getChildId(int groupPosition, int childPosition) {
                return childPosition;
            }


/**———-根据上面得到的ID的值,来得到armTypes和arms中元素的个数 ————————*/

            //获取的群体数量,得到armTypes里元素的个数
            @Override
            public int getGroupCount() {
                return armTypes.length;
            }


            //取得指定组中的儿童人数,就是armTypes中每一个种族它军种的个数
            @Override
            public int getChildrenCount(int groupPosition) {
                return arms[groupPosition].length;
            }


/**———-利用上面getGroupId得到ID,从而根据ID得到armTypes中的数据,并填到TextView中 —–*/

            //获取与给定的组相关的数据,得到数组armTypes中元素的数据
            @Override
            public Object getGroup(int groupPosition) {
                return armTypes[groupPosition];
            }


            //获取一个视图显示给定组,存放armTypes
            @Override
            public View getGroupView(int groupPosition, boolean isExpanded,
                    View convertView, ViewGroup parent) {
                TextView textView = getTextView();//调用定义的getTextView()方法
                textView.setText(getGroup(groupPosition).toString());//添加数据
                return textView;
            }


/**———-利用上面getChildId得到ID,从而根据ID得到arms中的数据,并填到TextView中———*/

            //获取与孩子在给定的组相关的数据,得到数组arms中元素的数据
            @Override
            public Object getChild(int groupPosition, int childPosition) {
                return arms[groupPosition][childPosition];
            }


            //获取一个视图显示在给定的组 的儿童的数据,就是存放arms
            @Override
            public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                    View convertView, ViewGroup parent) {
                LinearLayout ll = new LinearLayout(ExpandableListViewActivity.this);
                ll.setOrientation(0);//定义为纵向排列
                ImageView logo = new ImageView(ExpandableListViewActivity.this);
                logo.setImageResource(images[groupPosition]);//添加图片
                ll.addView(logo);
                TextView textView = getTextView();//调用定义的getTextView()方法
                textView.setText(getChild(groupPosition,childPosition).toString());//添加数据
                ll.addView(textView);
                return ll;
            }


/**——————自定义一个设定TextView属性的方法———————————————-*/

            //定义一个TextView
            private TextView getTextView(){
                AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,40);
                TextView textView = new TextView(ExpandableListViewActivity.this);
                textView.setLayoutParams(lp);
                textView.setPadding(36, 0, 0, 0);
                textView.setTextSize(20);
                return textView;
            }


/**——————-其他设置——————————————————————-*/

            //孩子在指定的位置是可选的,即:arms中的元素是可点击的
            @Override
            public boolean isChildSelectable(int groupPosition,
                    int childPosition) {
                return true;
            }


            //表示孩子是否和组ID是跨基础数据的更改稳定
            public boolean hasStableIds() {
                return true;
            }

        }
;

            /**使用适配器*/
            ExpandableListView expandListView = (ExpandableListView) this.findViewById(R.id.ecpandable);
            expandListView.setAdapter(adapter);
    }



}