Android 高仿QQ 好友分组列表

Android 4.0


实现的效果如下:


用ExpandableListView实现,

先看Activity的代码:

  1. public class BuddyActivity extends Activity {  
  2.     ExpandableListView expandablelistview;  
  3.     //群组名称     
  4.     private String[] group = new String[] { "在线好友""我的好友""我的同事"};    
  5.     //好友名称     
  6.     private String[][] buddy = new String[][] {  
  7.             { "元芳""雷丶小贱""狄大人"},   
  8.             {"高太后""士兵甲""士兵乙""士兵丙" },  
  9.             { "艺术家""叫兽""攻城师""职业玩家" }};    
  10.       
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  14.         setContentView(R.layout.activity_buddy);  
  15.           
  16.         expandablelistview= (ExpandableListView) findViewById(R.id.buddy_expandablelistview);  
  17.         ExpandableListAdapter adapter=new BuddyAdapter(this,group,buddy);  
  18.         expandablelistview.setAdapter(adapter);  
  19.         //分组展开  
  20.         expandablelistview.setOnGroupExpandListener(new OnGroupExpandListener(){  
  21.             public void onGroupExpand(int groupPosition) {  
  22.             }  
  23.         });  
  24.         //分组关闭  
  25.         expandablelistview.setOnGroupCollapseListener(new OnGroupCollapseListener(){  
  26.             public void onGroupCollapse(int groupPosition) {  
  27.             }  
  28.         });  
  29.         //子项单击  
  30.         expandablelistview.setOnChildClickListener(new OnChildClickListener(){  
  31.             public boolean onChildClick(ExpandableListView arg0, View arg1,  
  32.                     int groupPosition, int childPosition, long arg4) {  
  33.                 Toast.makeText(BuddyActivity.this,   
  34.                         group[groupPosition]+" : "+buddy[groupPosition][childPosition],   
  35.                         Toast.LENGTH_SHORT).show();  
  36.                 return false;  
  37.             }  
  38.         });  
  39.     }  
  40. }  

ExpandableListView的布局有2个,分别是组的布局和子项(即好友),

先看buddy_listview_group_item.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/RelativeLayout1"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="30dip"   
  6.     android:background="@drawable/group_fold_bg">  
  7.     <ImageView  
  8.         android:id="@+id/buddy_listview_image"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_alignParentLeft="true"  
  12.         android:layout_centerVertical="true"  
  13.         android:layout_marginLeft="10dp"  
  14.         android:src="@drawable/group_fold_arrow" />  
  15.     <TextView  
  16.         android:id="@+id/buddy_listview_group_name"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_centerVertical="true"  
  20.         android:layout_alignTop="@+id/buddy_listview_image"  
  21.         android:layout_toRightOf="@+id/buddy_listview_image"  
  22.         android:text="分组名称" />  
  23.     <TextView  
  24.         android:id="@+id/buddy_listview_group_num"  
  25.         android:layout_width="wrap_content"  
  26.         android:layout_height="wrap_content"  
  27.         android:layout_alignParentRight="true"  
  28.         android:layout_centerVertical="true"  
  29.         android:layout_marginRight="10dp"  
  30.         android:text="[10/10]" />  
  31. </RelativeLayout>  

下面是buddy_listview_child_item.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="40dip" >  
  5.     <ImageView  
  6.         android:id="@+id/buddy_listview_child_avatar"  
  7.         android:layout_width="40dip"  
  8.         android:layout_height="40dip"  
  9.         android:layout_alignParentLeft="true"  
  10.         android:layout_alignParentTop="true"  
  11.         android:layout_marginLeft="10dp"  
  12.         android:src="@drawable/avatar" />  
  13.     <TextView  
  14.         android:id="@+id/buddy_listview_child_nick"  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content"  
  17.         android:layout_alignParentTop="true"  
  18.         android:layout_toRightOf="@+id/buddy_listview_child_avatar"  
  19.         android:text="昵称"  
  20.         android:textSize="16sp" />  
  21.     <TextView  
  22.         android:id="@+id/buddy_listview_child_trends"  
  23.         android:layout_width="wrap_content"  
  24.         android:layout_height="wrap_content"  
  25.         android:layout_alignLeft="@+id/buddy_listview_child_nick"  
  26.         android:layout_alignParentBottom="true"  
  27.         android:text="该好友暂时没有新动态"  
  28.         android:textSize="12sp" />  
  29.   
  30. </RelativeLayout>  


Adapter自然是对应的BaseExpandableListAdapter

  1. public class BuddyAdapter extends BaseExpandableListAdapter {     
  2.     private String[] group;   
  3.     private String[][] buddy;  
  4.     private Context context;  
  5.     LayoutInflater inflater;  
  6.       
  7.     public BuddyAdapter(Context context,String[] group,String[][] buddy){  
  8.         this.context=context;  
  9.         inflater = LayoutInflater.from(context);  
  10.         this.group=group;  
  11.         this.buddy=buddy;  
  12.     }  
  13.     public Object getChild(int groupPosition, int childPosition) {  
  14.         return buddy[groupPosition][childPosition];  
  15.     }  
  16.   
  17.     public long getChildId(int groupPosition, int childPosition) {  
  18.         return childPosition;  
  19.     }  
  20.   
  21.     public View getChildView(int groupPosition, int childPosition, boolean arg2, View convertView,  
  22.             ViewGroup arg4) {  
  23.         convertView = inflater.inflate(R.layout.buddy_listview_child_item, null);  
  24.         TextView nickTextView=(TextView) convertView.findViewById(R.id.buddy_listview_child_nick);  
  25.         nickTextView.setText(getChild(groupPosition, childPosition).toString());  
  26.         return convertView;  
  27.     }  
  28.   
  29.     public int getChildrenCount(int groupPosition) {  
  30.         return buddy[groupPosition].length;  
  31.     }  
  32.   
  33.     public Object getGroup(int groupPosition) {  
  34.         return group[groupPosition];  
  35.     }  
  36.   
  37.     public int getGroupCount() {  
  38.         return group.length;  
  39.     }  
  40.   
  41.     public long getGroupId(int groupPosition) {  
  42.         return groupPosition;  
  43.     }  
  44.   
  45.     public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup arg3) {  
  46.         convertView = inflater.inflate(R.layout.buddy_listview_group_item, null);  
  47.         TextView groupNameTextView=(TextView) convertView.findViewById(R.id.buddy_listview_group_name);  
  48.         groupNameTextView.setText(getGroup(groupPosition).toString());  
  49.         ImageView image = (ImageView) convertView.findViewById(R.id.buddy_listview_image);  
  50.         image.setImageResource(R.drawable.group_unfold_arrow);  
  51.         //更换展开分组图片  
  52.         if(!isExpanded){  
  53.             image.setImageResource(R.drawable.group_fold_arrow);  
  54.         }  
  55.         return convertView;  
  56.     }  
  57.   
  58.     public boolean hasStableIds() {  
  59.         return true;  
  60.     }  
  61.     // 子选项是否可以选择    
  62.     public boolean isChildSelectable(int arg0, int arg1) {  
  63.         // TODO Auto-generated method stub  
  64.         return true;  
  65.     }  
  66. }