android ExpandableListView詳解

ExpandableListView是android中可以實現下拉list的一個控件,是一個垂直滾動的心事兩個級別列表項手風琴試圖,列表項是來自ExpandableListViewaAdapter,組可以單獨展開。

重要方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
expandGroup (int groupPos) ;//在分組列表視圖中 展開一組,
setSelectedGroup (int groupPosition) ;//設置選擇指定的組。
 
setSelectedChild (int groupPosition, int childPosition, boolean shouldExpandGroup);//設置選擇指定的子項。
 
getPackedPositionGroup (long packedPosition);//返回所選擇的組
 
getPackedPositionForChild (int groupPosition, int childPosition) ;//返回所選擇的子項
 
getPackedPositionType (long packedPosition);//返回所選擇項的類型(Child,Group)
 
isGroupExpanded (int groupPosition);//判斷此組是否展開

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

 

 

?
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
package com.test;
 
import java.util.ArrayList;
import java.util.List;
 
import javax.security.auth.PrivateCredentialPermission;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
 
public class ExpandableListViewDemo extends Activity {
    /** 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
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        requestWindowFeature(Window.FEATURE_NO_TITLE);  //設置爲無標題 
        setContentView(R.layout.expandablelistview);
        expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);
        groupArray =new ArrayList<String>();
        childArray = new ArrayList<List<String>>();
        
        /*-第一季-*/
        initdate();
        expandableListView_one.setAdapter(new ExpandableListViewaAdapter(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));
         
    }
    class ExpandableListViewaAdapter extends BaseExpandableListAdapter {
        Activity activity;
         public  ExpandableListViewaAdapter(Activity a) 
            
                activity = a; 
            
       /*-----------------Child */
        @Override
        public Object getChild(int groupPosition, int childPosition) {
            // TODO Auto-generated method stub
            return childArray.get(groupPosition).get(childPosition);
        }
 
        @Override
        public long getChildId(int groupPosition, int childPosition) {
            // TODO Auto-generated method stub
            return childPosition;
        }
 
        @Override
        public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent) {
             
            String string =childArray.get(groupPosition).get(childPosition);
             
            return getGenericView(string);
        }
 
        @Override
        public int getChildrenCount(int groupPosition) {
            // TODO Auto-generated method stub
            return childArray.get(groupPosition).size();
        }
       /* ----------------------------Group */
        @Override
        public Object getGroup(int groupPosition) {
            // TODO Auto-generated method stub
            return getGroup(groupPosition);
        }
 
        @Override
        public int getGroupCount() {
            // TODO Auto-generated method stub
            return groupArray.size();
        }
 
        @Override
        public long getGroupId(int groupPosition) {
            // TODO Auto-generated method stub
            return groupPosition;
        }
 
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent) {
             
           String   string=groupArray.get(groupPosition);
           return getGenericView(string);
        }
 
        @Override
        public boolean hasStableIds() {
            // TODO Auto-generated method stub
            return false;
        }
 
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition)
        {
            // TODO Auto-generated method stub
            return true;
        }
         
        private TextView  getGenericView(String string )
        {
              AbsListView.LayoutParams  layoutParams =new AbsListView.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT);
               
              TextView  textView =new TextView(activity);
              textView.setLayoutParams(layoutParams);
               
              textView.setGravity(Gravity.CENTER_VERTICAL |Gravity.LEFT);
               
              textView.setPadding(40, 0, 0, 0);
              textView.setText(string);
              return textView;
         }
    }
     
    private void initdate()
    {
        addInfo("語言", new String[]{"Oracle","Java","Linux","Jquery"});
        addInfo("男人的需求", new String[]{"金錢","事業","權力","女人","房子","車","球"});
    }
    private void addInfo(String group,String []child) {
         
        groupArray.add(group);
         
        List<String>  childItem =new ArrayList<String>();
         
        for(int index=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 = 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));

 運行效果:

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

案例二:

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
<?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" >
     <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
<?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" >
     <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
package com.test;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.security.auth.PrivateCredentialPermission;
 
import com.test.R;
import com.test.ExpandableListViewDemo.ExpandableListViewaAdapter;
import com.test.R.id;
import com.test.R.layout;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.SimpleExpandableListAdapter;
import android.widget.TextView;
 
public class ExpandableListViewDemo_two extends Activity {
    /** Called when the activity is first created. */  
    private  ExpandableListView  expandableListView_one;
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.expandablelistview);  
        expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);  
        //創建二個一級條目標題   
        Map<String, String> title_1 = new HashMap<String, String>();  
        Map<String, String> title_2 = new HashMap<String, String>();  
            
        title_1.put("group", "移動開發");  
        title_2.put("group", "男人的需求");  
            
        //創建一級條目容器   
        List<Map<String, String>> gruops = new ArrayList<Map<String,String>>();  
            
        gruops.add(title_1);  
        gruops.add(title_2);  
            
        //創建二級條目內容   
            
        //內容一   
        Map<String, String> content_1 = new HashMap<String, String>();  
        Map<String, String> content_2 = new HashMap<String, String>();  
            
        content_1.put("child", "ANDROID");  
        content_2.put("child", "IOS");  
            
        List<Map<String, String>> childs_1 = new ArrayList<Map<String,String>>();  
        childs_1.add(content_1);  
        childs_1.add(content_2);  
            
        //內容二   
        Map<String, String> content_3 = new HashMap<String, String>();  
        Map<String, String> content_4 = new HashMap<String, String>(); 
        Map<String, String> content_5 = new HashMap<String, String>();
            
        content_3.put("child", "金錢");  
        content_4.put("child", "權力");  
        content_5.put("child", "女人");
        List<Map<String, String>> childs_2 = new ArrayList<Map<String,String>>();  
        childs_2.add(content_3);  
        childs_2.add(content_4); 
        childs_2.add(content_5);
            
        //存放兩個內容, 以便顯示在列表中   
        List<List<Map<String, String>>> childs = new ArrayList<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 = new SimpleExpandableListAdapter(  
                this, gruops, R.drawable.expandablelistview_groups, new String[]{"group"}, new int[]{R.id.textGroup},   
                childs, R.drawable.expandablelistview_child, new String[]{"child"}, new int[]{R.id.textChild}  
                );  
            
        //加入列表   
        expandableListView_one.setAdapter(adapter);
     expandableListView_one.setOnChildClickListener(listener);
    }  
    private OnChildClickListener  listener =new OnChildClickListener() {
   @Override
  public boolean onChildClick(ExpandableListView parent, View v,
    int groupPosition, int childPosition, long id) {
   // TODO Auto-generated method stub
   toast("點擊了");
   return false;
  }
 };
 private void toast(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
private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {
        int len = to.length;
 
        for (int i = 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
public class MyExpandableListAdapter extends BaseExpandableListAdapter{
        private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {
                int len = to.length;
                boolean isBound = false;
                for (int i = 0; i < len; i++) {
                   final View v = view.findViewById(to[i]);
                 if (v!=null) {
                final Object _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]));
                                }                              
                        }
                }
        }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章