Android之實現QQ好友分組(ExpandableListView)

在項目開發中,也許我們遇到過ListView中嵌套ListView,但谷歌建議我們最好別這樣做,因此他們寫好了一個ExpandableListView類,他繼承ListView,可以實現ListView中嵌套ListView的效果,好了,廢話不多說,先上效果圖:

點擊下載源碼:仿QQ好友分組源代碼


 

主代碼:

[java] view plaincopy
  1. public class ExListView extends Activity {  
  2.     private static final String GROUP_TEXT = "group_text";//大組成員Map的key  
  3.     private static final String CHILD_TEXT1 = "child_text1";//小組成員Map的第一個key  
  4.     private static final String CHILD_TEXT2 = "child_text2";//小組成員Map的第二個key  
  5.   
  6.     List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();//大組成員  
  7.     List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();//小組成員  
  8.   
  9.     ExAdapter adapter;  
  10.     ExpandableListView exList;//可擴展的ListView  
  11.   
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.         //爲大小組中添加數據  
  17.         for (int i = 1; i < 6; i++) {  
  18.             Map<String, String> curGroupMap = new HashMap<String, String>();  
  19.             groupData.add(curGroupMap);  
  20.             curGroupMap.put(GROUP_TEXT, "第" + i + "大組");  
  21.   
  22.             List<Map<String, String>> children = new ArrayList<Map<String, String>>();  
  23.             for (int j = 1; j < 6; j++) {  
  24.                 Map<String, String> curChildMap = new HashMap<String, String>();  
  25.                 children.add(curChildMap);  
  26.                 curChildMap.put(CHILD_TEXT1, "第" + j + "小組");  
  27.                 curChildMap.put(CHILD_TEXT2, "第" + j + "小組簽名");  
  28.             }  
  29.             childData.add(children);  
  30.         }  
  31.   
  32.         adapter = new ExAdapter(ExListView.this);  
  33.         exList = (ExpandableListView) findViewById(R.id.list);  
  34.         exList.setAdapter(adapter);  
  35.         exList.setGroupIndicator(null);//不設置大組指示器圖標,因爲我們自定義設置了  
  36.         exList.setDivider(null);//設置圖片可拉伸的  
  37.     }  
  38.     //關鍵代碼是這個可擴展的listView適配器  
  39.     class ExAdapter extends BaseExpandableListAdapter {  
  40.         Context context;  
  41.   
  42.         public ExAdapter(Context context) {  
  43.             super();  
  44.             this.context = context;  
  45.         }  
  46.         //得到大組成員的view  
  47.         public View getGroupView(int groupPosition, boolean isExpanded,  
  48.                 View convertView, ViewGroup parent) {  
  49.             View view = convertView;  
  50.             if (view == null) {  
  51.                 LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  52.                 view = inflater.inflate(R.layout.member_listview, null);  
  53.             }  
  54.   
  55.             TextView title = (TextView) view.findViewById(R.id.content_001);  
  56.             title.setText(getGroup(groupPosition).toString());//設置大組成員名稱  
  57.   
  58.             ImageView image = (ImageView) view.findViewById(R.id.tubiao);//是否展開大組的箭頭圖標  
  59.             if (isExpanded)//大組展開時  
  60.                 image.setBackgroundResource(R.drawable.btn_browser2);  
  61.             else//大組合並時  
  62.                 image.setBackgroundResource(R.drawable.btn_browser);  
  63.   
  64.             return view;  
  65.         }  
  66.         //得到大組成員的id  
  67.         public long getGroupId(int groupPosition) {  
  68.             return groupPosition;  
  69.         }  
  70.         //得到大組成員名稱  
  71.         public Object getGroup(int groupPosition) {  
  72.             return groupData.get(groupPosition).get(GROUP_TEXT).toString();  
  73.         }  
  74.         //得到大組成員總數  
  75.         public int getGroupCount() {  
  76.             return groupData.size();  
  77.   
  78.         }  
  79.   
  80.         // 得到小組成員的view  
  81.         public View getChildView(int groupPosition, int childPosition,  
  82.                 boolean isLastChild, View convertView, ViewGroup parent) {  
  83.             View view = convertView;  
  84.             if (view == null) {  
  85.                 LayoutInflater inflater = LayoutInflater.from(context);  
  86.                 view = inflater.inflate(R.layout.member_childitem, null);  
  87.             }  
  88.             final TextView title = (TextView) view  
  89.                     .findViewById(R.id.child_text);  
  90.             title.setText(childData.get(groupPosition).get(childPosition)  
  91.                     .get(CHILD_TEXT1).toString());//大標題  
  92.             final TextView title2 = (TextView) view  
  93.                     .findViewById(R.id.child_text2);  
  94.             title2.setText(childData.get(groupPosition).get(childPosition)  
  95.                     .get(CHILD_TEXT2).toString());//小標題  
  96.   
  97.             return view;  
  98.         }  
  99.         //得到小組成員id  
  100.         public long getChildId(int groupPosition, int childPosition) {  
  101.             return childPosition;  
  102.         }  
  103.         //得到小組成員的名稱  
  104.         public Object getChild(int groupPosition, int childPosition) {  
  105.             return childData.get(groupPosition).get(childPosition).get(CHILD_TEXT1)  
  106.                     .toString();  
  107.         }  
  108.         //得到小組成員的數量  
  109.         public int getChildrenCount(int groupPosition) {  
  110.             return childData.get(groupPosition).size();  
  111.         }  
  112.         /** 
  113.          * Indicates whether the child and group IDs are stable across changes to the 
  114.          * underlying data. 
  115.          * 表明大組和小組id是否穩定的更改底層數據。 
  116.          * @return whether or not the same ID always refers to the same object 
  117.          * @see Adapter#hasStableIds() 
  118.          */  
  119.         public boolean hasStableIds() {  
  120.             return true;  
  121.         }  
  122.         //得到小組成員是否被選擇  
  123.         public boolean isChildSelectable(int groupPosition, int childPosition) {  
  124.             return true;  
  125.         }  
  126.   
  127.     }  
  128. }  


主界面配置文件main.xml:

[html] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:background="@drawable/default_bg" >  
  6.   
  7.     <ExpandableListView  
  8.         android:id="@+id/list"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:layout_alignParentLeft="true" android:cacheColorHint="#00000000" /><!-- 背景設置爲透明,防止滑動時,白屏 -->  
  12.   
  13. </RelativeLayout>  


大組成員配置文件member_listview.xml:

[html] view plaincopy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_gravity="center_horizontal" >  
  6.   
  7.     <LinearLayout  
  8.         android:id="@+id/layout_013"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:orientation="horizontal" >  
  12.   
  13.         <ImageView  
  14.             android:id="@+id/ImageView01"  
  15.             android:layout_width="wrap_content"  
  16.             android:layout_height="wrap_content"  
  17.             android:gravity="center_vertical"  
  18.             android:paddingTop="10dp"  
  19.             android:src="@drawable/user_group" >  
  20.         </ImageView>  
  21.   
  22.         <RelativeLayout  
  23.             android:id="@+id/layout_013"  
  24.             android:layout_width="wrap_content"  
  25.             android:layout_height="wrap_content" >  
  26.   
  27.             <TextView  
  28.                 android:id="@+id/content_001"  
  29.                 android:layout_width="wrap_content"  
  30.                 android:layout_height="fill_parent"  
  31.                 android:layout_gravity="center_vertical"  
  32.                 android:gravity="center_vertical"  
  33.                 android:paddingLeft="10dp"  
  34.                 android:textColor="#FFFFFF"  
  35.                 android:textSize="30sp" >  
  36.             </TextView>  
  37.   
  38.             <ImageView  
  39.                 android:id="@+id/tubiao"  
  40.                 android:layout_width="wrap_content"  
  41.                 android:layout_height="wrap_content"  
  42.                 android:layout_alignParentRight="true" >  
  43.             </ImageView>  
  44.         </RelativeLayout>  
  45.     </LinearLayout>  
  46.   
  47.     <!--  
  48.    <RelativeLayout android:id="@+id/layout_013"   
  49.                 android:layout_width="fill_parent"   
  50.                 android:layout_height="fill_parent">  
  51.        <ImageView android:id="@+id/ImageView01"   
  52.                   android:layout_width="wrap_content"   
  53.                   android:layout_height="wrap_content"  
  54.                   android:src="@drawable/icon"></ImageView>  
  55.        <TextView android:id="@+id/content_001"   
  56.                  android:text="@+id/TextView01"   
  57.                  android:layout_width="wrap_content"   
  58.                  android:layout_toRightOf="@+id/ImageView01"   
  59.                  android:layout_height="wrap_content"></TextView>  
  60.       <ImageView android:layout_width="wrap_content"   
  61.                  android:layout_toRightOf="@+id/content_001"   
  62.                  android:layout_height="wrap_content"   
  63.                  android:id="@+id/tubiao"></ImageView>  
  64.    </RelativeLayout>  
  65.   
  66.   
  67.     -->  
  68.   
  69. </LinearLayout>  


小組成員配置文件member_childitem.xml:

[html] view plaincopy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:id="@+id/childlayout"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:orientation="horizontal" >  
  7.   
  8.     <ImageView  
  9.         android:id="@+id/child_image"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:layout_marginLeft="40dp"  
  13.         android:background="@drawable/child_image"  
  14.         android:paddingTop="10dp" >  
  15.     </ImageView>  
  16.   
  17.     <LinearLayout  
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:orientation="vertical" >  
  21.   
  22.         <TextView  
  23.             android:id="@+id/child_text"  
  24.             android:layout_width="wrap_content"  
  25.             android:layout_height="wrap_content"  
  26.             android:layout_gravity="center_vertical"  
  27.             android:gravity="center_vertical"  
  28.             android:text=""  
  29.             android:textColor="#FFFFFF"  
  30.             android:textSize="25sp" >  
  31.         </TextView>  
  32.   
  33.         <TextView  
  34.             android:id="@+id/child_text2"  
  35.             android:layout_width="wrap_content"  
  36.             android:layout_height="wrap_content"  
  37.             android:layout_gravity="center_vertical"  
  38.             android:gravity="center_vertical"  
  39.             android:text=""  
  40.             android:textColor="#FFFFFF"  
  41.             android:textSize="20sp" >  
  42.         </TextView>  
  43.     </LinearLayout>  
  44.   
  45. </LinearLayout>  

原文:http://blog.csdn.net/way_ping_li/article/details/7995552
發佈了27 篇原創文章 · 獲贊 111 · 訪問量 58萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章