ExpandableListView

来源:互联网 发布:尤克里里淘宝网 编辑:程序博客网 时间:2024/06/05 03:59

ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。

原文地址:http://my.oschina.net/amigos/blog/62614

重要方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
expandGroup (intgroupPos) ;//在分组列表视图中 展开一组,
setSelectedGroup (intgroupPosition) ;//设置选择指定的组。
 
setSelectedChild (intgroupPosition,intchildPosition,booleanshouldExpandGroup);//设置选择指定的子项。
 
getPackedPositionGroup (longpackedPosition);//返回所选择的组
 
getPackedPositionForChild (intgroupPosition,intchildPosition) ;//返回所选择的子项
 
getPackedPositionType (longpackedPosition);//返回所选择项的类型(Child,Group)
 
isGroupExpanded (intgroupPosition);//判断此组是否展开

 expandableListView.setDivider();这个是设定每个Group之间的分割线。

  expandableListView.setGroupIndicator();这个是设定每个Group之前的那个图标。

  expandableListView.collapseGroup(int group); 将第group组收起

ExpandableListAdapter

一个接口,将基础数据链接到一个ExpandableListView。 此接口的实施将提供访问Child的数据(由组分类),并实例化的Child和Group。

1.重要方法

    getChildId (int groupPosition, int childPosition) 获取与在给定组给予孩子相关的数据。

    getChildrenCount (int groupPosition) 返回在指定Group的Child数目。

案例:

首先定义个一个布局文件expandablelistview.xml

 

?
1
2
3
4
5
6
7
8
9
10
11
12
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
     <ExpandableListView
        android:id="@+id/expandableListView"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        >
     </ExpandableListView>
</LinearLayout>

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
packagecom.test;
 
importjava.util.ArrayList;
importjava.util.List;
 
importjavax.security.auth.PrivateCredentialPermission;
 
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.Gravity;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.view.Window;
importandroid.widget.AbsListView;
importandroid.widget.BaseExpandableListAdapter;
importandroid.widget.ExpandableListView;
importandroid.widget.TextView;
 
publicclassExpandableListViewDemo extendsActivity {
    /** Called when the activity is first created. */
     
    //定义两个List用来控制Group和Child中的String;
     
    private List<String>  groupArray;//组列表
    private List<List<String>> childArray;//子列表
    private ExpandableListView  expandableListView_one;
     
    @Override
    publicvoidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        requestWindowFeature(Window.FEATURE_NO_TITLE);  //设置为无标题 
        setContentView(R.layout.expandablelistview);
        expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);
        groupArray =newArrayList<String>();
        childArray = newArrayList<List<String>>();
        
        /*-第一季-*/
        initdate();
        expandableListView_one.setAdapter(newExpandableListViewaAdapter(ExpandableListViewDemo.this));
         
        /*-第二季-*/
//        groupArray.add("移动开发");
//        List<String> arrayList = new ArrayList<String>();
//        arrayList.add("Android");
//        arrayList.add("IOS");
//        arrayList.add("Windows Phone");
//        //组循环
//        for(int index=0;index<groupArray.size();++index)
//        {
//          childArray.add(arrayList);
//        }
//        expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));
         
    }
    classExpandableListViewaAdapterextendsBaseExpandableListAdapter {
        Activity activity;
         public ExpandableListViewaAdapter(Activity a) 
            
                activity = a; 
            
       /*-----------------Child */
        @Override
        publicObject getChild(intgroupPosition,intchildPosition) {
            // TODO Auto-generated method stub
            returnchildArray.get(groupPosition).get(childPosition);
        }
 
        @Override
        publiclonggetChildId(intgroupPosition,intchildPosition) {
            // TODO Auto-generated method stub
            returnchildPosition;
        }
 
        @Override
        publicView getChildView(intgroupPosition,intchildPosition,
                booleanisLastChild, View convertView, ViewGroup parent) {
             
            String string =childArray.get(groupPosition).get(childPosition);
             
            returngetGenericView(string);
        }
 
        @Override
        publicintgetChildrenCount(intgroupPosition) {
            // TODO Auto-generated method stub
            returnchildArray.get(groupPosition).size();
        }
       /* ----------------------------Group */
        @Override
        publicObject getGroup(intgroupPosition) {
            // TODO Auto-generated method stub
            returngetGroup(groupPosition);
        }
 
        @Override
        publicintgetGroupCount() {
            // TODO Auto-generated method stub
            returngroupArray.size();
        }
 
        @Override
        publiclonggetGroupId(intgroupPosition) {
            // TODO Auto-generated method stub
            returngroupPosition;
        }
 
        @Override
        publicView getGroupView(intgroupPosition,booleanisExpanded,
                View convertView, ViewGroup parent) {
             
           String   string=groupArray.get(groupPosition);
           returngetGenericView(string);
        }
 
        @Override
        publicbooleanhasStableIds() {
            // TODO Auto-generated method stub
            returnfalse;
        }
 
        @Override
        publicbooleanisChildSelectable(intgroupPosition,intchildPosition)
        {
            // TODO Auto-generated method stub
            returntrue;
        }
         
        privateTextView  getGenericView(String string )
        {
              AbsListView.LayoutParams  layoutParams =newAbsListView.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT);
               
              TextView  textView =newTextView(activity);
              textView.setLayoutParams(layoutParams);
               
              textView.setGravity(Gravity.CENTER_VERTICAL |Gravity.LEFT);
               
              textView.setPadding(40,0,0,0);
              textView.setText(string);
              returntextView;
         }
    }
     
    privatevoidinitdate()
    {
        addInfo("语言",newString[]{"Oracle","Java","Linux","Jquery"});
        addInfo("男人的需求",newString[]{"金钱","事业","权力","女人","房子","车","球"});
    }
    privatevoidaddInfo(String group,String []child) {
         
        groupArray.add(group);
         
        List<String>  childItem =newArrayList<String>();
         
        for(intindex=0;index<child.length;index++)
        {
            childItem.add(child[index]);
        }
         childArray.add(childItem);
    }
}

运行效果:

注释修改如下代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*-第一季-*/
//        initdate();
//        expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));
         
        /*-第二季-*/
        groupArray.add("移动开发");
        List<String> arrayList = newArrayList<String>();
        arrayList.add("Android");
        arrayList.add("IOS");
        arrayList.add("Windows Phone");
        //组循环
        for(intindex=0;index<groupArray.size();++index)
        {
            childArray.add(arrayList);
        }
        expandableListView_one.setAdapter(newExpandableListViewaAdapter(ExpandableListViewDemo.this));

 运行效果:

★★★★★★★★★★★★★★★★★★★★

案例二:

1.定义一个主界面expandablelistview.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
     <ExpandableListView
        android:id ="@+id/expandableListView"  
        android:layout_width ="fill_parent"  
        android:layout_height ="wrap_content"  
        >
     </ExpandableListView>
</LinearLayout>

2.在res/drawable目录下创建样式文件expandablelistview_groups.xml该界面是组界面:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
     <TextView
        android:id="@+id/textGroup"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:paddingLeft="40px"  
        android:paddingTop="6px"  
        android:paddingBottom="6px"  
        android:textSize="15sp"  
        android:text="No data"  
    >  
    </TextView>
</LinearLayout>

3.在res/drawable目录下创建样式文件expandablelistview_child.xml;是子控件,直接显示列表内容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
     <TextView    
        android:id="@+id/textChild"  
        android:layout_width="fill_parent"   
        android:layout_height="fill_parent"   
        android:paddingLeft="60px"  
        android:paddingTop="10px"  
        android:paddingBottom="10px"  
        android:textSize="20sp"  
        android:text="No Data" /> 
</LinearLayout>

定义java文件:ExpandableListViewDemo_two.java

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
packagecom.test;
 
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
 
importjavax.security.auth.PrivateCredentialPermission;
 
importcom.test.R;
importcom.test.ExpandableListViewDemo.ExpandableListViewaAdapter;
importcom.test.R.id;
importcom.test.R.layout;
 
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.Gravity;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.view.Window;
importandroid.widget.AbsListView;
importandroid.widget.BaseExpandableListAdapter;
importandroid.widget.ExpandableListView;
importandroid.widget.SimpleExpandableListAdapter;
importandroid.widget.TextView;
 
publicclassExpandableListViewDemo_two extendsActivity {
    /** Called when the activity is first created. */  
    private ExpandableListView  expandableListView_one;
    @Override  
    publicvoidonCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.expandablelistview);  
        expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);  
        //创建二个一级条目标题   
        Map<String, String> title_1 = newHashMap<String, String>();  
        Map<String, String> title_2 = newHashMap<String, String>();  
            
        title_1.put("group","移动开发");  
        title_2.put("group","男人的需求");  
            
        //创建一级条目容器   
        List<Map<String, String>> gruops = newArrayList<Map<String,String>>();  
            
        gruops.add(title_1);  
        gruops.add(title_2);  
            
        //创建二级条目内容   
            
        //内容一   
        Map<String, String> content_1 = newHashMap<String, String>();  
        Map<String, String> content_2 = newHashMap<String, String>();  
            
        content_1.put("child","ANDROID");  
        content_2.put("child","IOS");  
            
        List<Map<String, String>> childs_1 = newArrayList<Map<String,String>>();  
        childs_1.add(content_1);  
        childs_1.add(content_2);  
            
        //内容二   
        Map<String, String> content_3 = newHashMap<String, String>();  
        Map<String, String> content_4 = newHashMap<String, String>(); 
        Map<String, String> content_5 = newHashMap<String, String>();
            
        content_3.put("child","金钱");  
        content_4.put("child","权力");  
        content_5.put("child","女人");
        List<Map<String, String>> childs_2 = newArrayList<Map<String,String>>();  
        childs_2.add(content_3);  
        childs_2.add(content_4); 
        childs_2.add(content_5);
            
        //存放两个内容, 以便显示在列表中   
        List<List<Map<String, String>>> childs = newArrayList<List<Map<String,String>>>();  
        childs.add(childs_1);  
        childs.add(childs_2);  
            
        //创建ExpandableList的Adapter容器   
/** 
* 使用SimpleExpandableListAdapter显示ExpandableListView 
* 参数1.上下文对象Context 
* 参数2.一级条目目录集合 
* 参数3.一级条目对应的布局文件 (expandablelistview_groups.xml文件
* 参数4.fromto,就是map中的key,指定要显示的对象 
* 参数5.与参数4对应,指定要显示在groups中的id 
* 参数6.二级条目目录集合 
* 参数7.二级条目对应的布局文件 
* 参数9.与参数8对应,指定要显示在childs中的id 
/           SimpleExpandableListAdapter adapter = newSimpleExpandableListAdapter(  
                this, gruops, R.drawable.expandablelistview_groups, newString[]{"group"},newint[]{R.id.textGroup},   
                childs, R.drawable.expandablelistview_child, newString[]{"child"},newint[]{R.id.textChild}  
                );  
            
        //加入列表   
        expandableListView_one.setAdapter(adapter);
     expandableListView_one.setOnChildClickListener(listener);
    }  
    privateOnChildClickListener  listener =newOnChildClickListener() {
   @Override
  publicbooleanonChildClick(ExpandableListView parent, View v,
    intgroupPosition,intchildPosition,longid) {
   // TODO Auto-generated method stub
   toast("点击了");
   returnfalse;
  }
 };
 privatevoidtoast(String str) {
 Toast.makeText(this, str, Toast.LENGTH_LONG).show(); 
 }
}

 上面的样式也可以使用系统的自带的样式如下:

android.R.layout.simple_expandable_list_item_1,//层显示样式 ,系统自定义  

android.R.layout.simple_expandable_list_item_2,  

运行效果:

案例三:如果group中有个ImageVIew将会是什么情况呢?

在SimpleExpandableListAdapter中有如下方法:

?
1
2
3
4
5
6
7
8
9
10
privatevoidbindView(View view, Map<String, ?> data, String[] from, int[] to) {
        intlen = to.length;
 
        for(inti = 0; i < len; i++) {
            TextView v = (TextView)view.findViewById(to[i]);
            if(v != null) {
                v.setText((String)data.get(from[i]));
            }
        }
    }

从上面的方法中可以看出 SimpleExpandableListAdapter把所以的View都当成TextView来处理了,而不像SimpleAdapter可以自动判断View的类型,自动绑定,解决版本就是重写bingview回调一下试试:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
publicclassMyExpandableListAdapter extendsBaseExpandableListAdapter{
        privatevoidbindView(View view, Map<String, ?> data, String[] from, int[] to) {
                intlen = to.length;
                booleanisBound = false;
                for(inti = 0; i < len; i++) {
                   finalView v = view.findViewById(to[i]);
                 if(v!=null) {
                finalObject _data = data.get(from[i]);
                String text = _data == null?"": data.toString();
                if(text == null) {
                    text = "";
                }
                          if(mViewBinder != null) {//如果Binder不为空,使用Binder进行处理
                                        isBound = mViewBinder.setViewValue(v, data.get(from[i]), text);
                                }
                                if(!isBound) {//如果Binder跳过,使用原来的方法进行处理
                                        TextView _v = (TextView)v;
                                        _v.setText((String)data.get(from[i]));
                                }                              
                        }
                }
        }
}
0 0