Android ExpandListview仿QQ列表展示

给大家分享一个仿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);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/nazicsdn/article/details/80693851