给大家分享一个仿qq的列表展示,它的实现原理就是一个子信息一个组信息,组信息里面嵌套子信息,组信息相当于qq分组,自信息相当于分组内的信息,点击展开分组,分组里会有很多子条目,当然子条目也可以点击,废话不多说,大家一看便知。
首先展示一下布局文件:
group.xml
<?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" >
<TextView
android:id="@+id/group_tv"
android:layout_width="wrap_content"
android:layout_height="45dp"
android:gravity="center_vertical"
android:text="aaaaa"
android:textSize="25sp" />
</LinearLayout>
child.xml
<?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" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_marginLeft="10dp"
>
<ImageView
android:id="@+id/img"
android:layout_width="45dp"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher"
/>
<TextView
android:id="@+id/child_tv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textSize="20sp"
android:text="aaaaaa"
android:layout_toRightOf="@id/img"
android:gravity="center_vertical"
android:layout_marginLeft="5dp"
/>
</RelativeLayout>
</LinearLayout>
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<ExpandableListView
android:id="@+id/expand"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:groupIndicator="@null"
></ExpandableListView>
</RelativeLayout>
//下面是主要实现代码:
ExpandInfo.class
import java.util.List;
//组信息
public class ExpandInfo {
public String title;//组的名字
public List<ChildInfo> childList;//组下面对应的子数据源
}
ChildInfo.class
// 子信息
public class ChildInfo {
public int headID;//每个用户的头像
public String NickName;//用户的昵称
}
MyAdapter.class(这个是expandlistview适配器)
import java.util.List;
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.TextView;
public class MyAdapter extends BaseExpandableListAdapter{
private List<ExpandInfo> list;
private Context ctx;
public MyAdapter(Context ctx,List<ExpandInfo> list) {
this.ctx=ctx;
this.list=list;
}
//组数
@Override
public int getGroupCount() {
return list.size();
}
//子数
@Override
public int getChildrenCount(int groupPosition) {
return list.get(groupPosition).childList.size();
}
//组的对象
@Override
public Object getGroup(int groupPosition) {
return list.get(groupPosition);
}
//获得子的对象
@Override
public Object getChild(int groupPosition, int childPosition) {
return list.get(groupPosition).childList.get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return childPosition;
}
//当子条目ID相同时是否复用
@Override
public boolean hasStableIds() {
return true;
}
//isExpanded:展开
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if(convertView==null)
convertView=View.inflate(ctx,R.layout.group, null);
TextView groupTv=(TextView) convertView.findViewById(R.id.group_tv);
groupTv.setText(list.get(groupPosition).title);
//组是否展开 如果展开,组变颜色
if(isExpanded){
groupTv.setTextColor(Color.BLUE);
}else{
groupTv.setTextColor(Color.BLACK);
}
return convertView;
}
//isLastChild:是否是该组最后子条目
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView==null){
holder=new ViewHolder();
convertView=View.inflate(ctx, R.layout.child, null);
holder.img=(ImageView) convertView.findViewById(R.id.img);
holder.child_tv=(TextView) convertView.findViewById(R.id.child_tv);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
holder.img.setImageResource(list.get(groupPosition).childList.get(childPosition).headID);
holder.child_tv.setText(list.get(groupPosition).childList.get(childPosition).NickName);
//如果是最后一条,最后最后一条变色
if(isLastChild){
holder.child_tv.setTextColor(Color.GREEN);
}else{
holder.child_tv.setTextColor(Color.BLACK);
}
return convertView;
}
//子条目是否可以被点击/选中/选择
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return true;
}
private class ViewHolder{
private ImageView img;
private TextView child_tv;
}
}
MainActivity.class(下面是主运行界面)
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.Toast;
public class MainActivity extends Activity {
private ExpandableListView ex;
//声明一个ExpandableListView 用的数据源
private List<ExpandInfo> list=new ArrayList<ExpandInfo>();
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ex=(ExpandableListView) findViewById(R.id.expand);
//初始化数据源
initList();
adapter=new MyAdapter(MainActivity.this, list);
ex.setAdapter(adapter);
//ExpandableListView子条目点击事件
ex.setOnChildClickListener(new OnChildClickListener() {
@SuppressLint("WrongConstant")
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
String str=((ChildInfo)adapter.getChild(groupPosition, childPosition)).NickName;
Toast.makeText(MainActivity.this, str, 0).show();
return false;
}
});
}
//初始化数据源
private void initList() {
for(int i=0;i<6;i++){
//创建组对象
ExpandInfo info=new ExpandInfo();
//循环添加组名
info.title="ExpandGroup"+i;
//创建子条目数据源
List<ChildInfo> clist=new ArrayList<ChildInfo>();
for(int j=0;j<10;j++){
//创建子对象
ChildInfo childinfo=new ChildInfo();
//循环添加用户头像和昵称
childinfo.headID=R.mipmap.ic_launcher;
childinfo.NickName="ExpandChild"+j;
//将子对象添加到子数据源
clist.add(childinfo);
}
//将子数据源赋值给组对象
info.childList=clist;
//将组对象添加到总数据源
list.add(info);
}
}
}