Android UI设计——ExpandableListView控件

本文详细介绍了Android中的ExpandableListView组件,通过示例展示了如何创建分组及子项的数据结构,并提供了自定义Adapter的具体实现代码。

ExpandableListView

  ExpandableListView是一种双层显示的View,为什么这么说呢,以我们的QQ为例,打开我们的QQ,我们首先会有一个联系人的分组,点击分组我们会看到分组内联系人的列表。这就是一种双层显示的View。ExpandableListView相当于两层的ListView嵌套。
  
  ExpandableListView的使用与ListView类似,只不过ExpandableListView在创建Adapter的时候需要重写两倍的ListView重写的方法(原因就是:ExpandableListView相当于两层的ListView嵌套)。ExpandableListView在创建Adapter需要继承BaseExpandableListAdapter。下面来看一下具体的代码:

  • 创建数据。我们以班级为分组。分别创建4个班,然后每个班有不同的学生。
//班级类
public class Clazz {
    private String clazzName;
    private String clazzNum;
    private List<Student> students;

    /*
    定义一个初始化的构造器。
     */

    public Clazz(String clazzName, String clazzNum) {
        this.clazzName = clazzName;
        this.clazzNum = clazzNum;
    }

    public String getClazzName() {
        return clazzName;
    }

    public void setClazzName(String clazzName) {
        this.clazzName = clazzName;
    }

    public String getClazzNum() {
        return clazzNum;
    }

    public void setClazzNum(String clazzNum) {
        this.clazzNum = clazzNum;
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }
}
//学生类

public class Student {
    private String studentName;
    private String age;
    private String sex;
    private String label;

    /*
    定义初始化的构造器
     */

    public Student(String label, String studentName, String age, String sex) {
        this.label = label;
        this.studentName = studentName;
        this.age = age;
        this.sex = sex;
    }

    public String getStudentName() {
        return studentName;
    }
    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getLabel() {
        return label;
    }
    public void setLabel(String label) {
        this.label = label;
    }
}
  • 自定义Adapter以及布局,将数据添加到布局中。

学生布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center|left">

    <ImageView
        android:id="@+id/imageview_student"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/a_mall_04"/>
    <TextView
        android:id="@+id/textview_student_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="学生姓名"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginLeft="10dp">
        <TextView
            android:id="@+id/textview_student_age"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="学生年龄"/>
        <TextView
            android:id="@+id/textview_student_sex"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="学生性别"/>
    </LinearLayout>
    <TextView
        android:id="@+id/textview_student_label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="学生签名"/>

</LinearLayout>

这里写图片描述
班级布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:gravity="center|left">

    <TextView
        android:id="@+id/textview_clazz_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="班级名称"
        android:layout_marginLeft="50dp"/>
    <TextView
        android:id="@+id/textview_clazz_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="班级编号"
        android:layout_marginLeft="10dp"/>
    <TextView
        android:id="@+id/textview_student_num"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="班级人数"
        android:layout_marginLeft="10dp"/>
</LinearLayout>

这里写图片描述

自定义的Adapter

public class MyExpandableListViewAdapter extends BaseExpandableListAdapter {

    private LayoutInflater mInflater;
    private List<Clazz> mClazzs;
    /*
    定义一个构造器
     */
    public MyExpandableListViewAdapter(LayoutInflater mInflater, List<Clazz> mClazzs) {
        this.mInflater = mInflater;
        this.mClazzs = mClazzs;
    }

    @Override
    public int getGroupCount() {
        return mClazzs.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return mClazzs.get(groupPosition).getStudents().size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return groupPosition;
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }
    //将班级数据添加到组布局中
    @Override
    public View getGroupView(int groupPosition, boolean b, View convertview, ViewGroup viewGroup) {
        GroupViewHolder groupViewHolder = null;

        if(convertview == null){
            convertview = mInflater.inflate(R.layout.item_parent_view,null);
            groupViewHolder = new GroupViewHolder();
            groupViewHolder.textViewClazzName = (TextView) convertview.findViewById(R.id.textview_clazz_name);
            groupViewHolder.textViewClazzNum = (TextView) convertview.findViewById(R.id.textview_clazz_num);
            groupViewHolder.textViewClazzStudentNum = (TextView) convertview.findViewById(R.id.textview_student_num);

            convertview.setTag(groupViewHolder);
        }else{
            groupViewHolder = (GroupViewHolder) convertview.getTag();
        }

        Clazz clazz = mClazzs.get(groupPosition);
        groupViewHolder.textViewClazzName.setText(clazz.getClazzName());
        groupViewHolder.textViewClazzNum.setText(clazz.getClazzNum());
        groupViewHolder.textViewClazzStudentNum.setText(""+clazz.getStudents().size());

        return convertview;
    }
    class GroupViewHolder{
        TextView textViewClazzName;
        TextView textViewClazzNum;
        TextView textViewClazzStudentNum;

    }
    //将学生数据添加到自布局中
    @Override
    public View getChildView(int groupPosition, int childPosition, boolean b, View convertview, ViewGroup viewGroup) {
        ChildViewHolder childViewHolder = null;

        if(convertview == null){
            convertview = mInflater.inflate(R.layout.item_child_view,null);
            childViewHolder = new ChildViewHolder();
            childViewHolder.textViewStudentName = (TextView) convertview.findViewById(R.id.textview_student_name);
            childViewHolder.textViewStudentAge = (TextView) convertview.findViewById(R.id.textview_student_age);
            childViewHolder.textViewStudentSex = (TextView) convertview.findViewById(R.id.textview_student_sex);
            childViewHolder.textViewStudentLabel = (TextView) convertview.findViewById(R.id.textview_student_label);

            convertview.setTag(childViewHolder);
        }else{
            childViewHolder = (ChildViewHolder) convertview.getTag();
        }

        Clazz clazz = mClazzs.get(groupPosition);
        Student student = clazz.getStudents().get(childPosition);
        childViewHolder.textViewStudentName.setText(student.getStudentName());
        childViewHolder.textViewStudentAge.setText(student.getAge());
        childViewHolder.textViewStudentSex.setText(student.getSex());
        childViewHolder.textViewStudentLabel.setText(student.getLabel());

        return convertview;
    }
    class ChildViewHolder{
        TextView textViewStudentName;
        TextView textViewStudentAge;
        TextView textViewStudentSex;
        TextView textViewStudentLabel;

    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return false;
    }
}
  • 初始化数据,并将View添加到ExpandableListView中。
public class MainActivity extends Activity {

    private ExpandableListView mExpandableListView;
    private List<Clazz> mClazzs;

    private LayoutInflater mInflater;
    private MyExpandableListViewAdapter mMyAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mExpandableListView = (android.widget.ExpandableListView) findViewById(R.id.expandablelistview);
        initData();

        mInflater = getLayoutInflater();
        mMyAdapter = new MyExpandableListViewAdapter(mInflater,mClazzs);
        mExpandableListView.setAdapter(mMyAdapter);
    }
    /*
    初始化数据
     */
    private void initData() {
        mClazzs = new ArrayList<Clazz>();
        //初始化一班
        Clazz clazz1 = new Clazz("一班","201501");
        List<Student> clazz1Students = new ArrayList<Student>();
        Student clazz1_Student1 = new Student("生命在于运动","张三","17","男");
        clazz1Students.add(clazz1_Student1);
        Student clazz1_Student2 = new Student("生命在于运动","李四","19","女");
        clazz1Students.add(clazz1_Student2);
        Student clazz1_Student3 = new Student("生命在于运动","王五","17","男");
        clazz1Students.add(clazz1_Student3);
        Student clazz1_Student4 = new Student("生命在于运动","赵六","20","男");
        clazz1Students.add(clazz1_Student4);
        Student clazz1_Student5 = new Student("生命在于运动","马奇","18","女");
        clazz1Students.add(clazz1_Student5);
        clazz1.setStudents(clazz1Students);
        mClazzs.add(clazz1);

        //初始化二班
        Clazz clazz2 = new Clazz("二班","201502");

        List<Student> clazz2Students = new ArrayList<Student>();
        Student clazz2_Student1 = new Student("生命在于运动","张三","17","男");
        clazz2Students.add(clazz2_Student1);
        Student clazz2_Student2 = new Student("生命在于运动","李四","19","女");
        clazz2Students.add(clazz2_Student2);
        Student clazz2_Student3 = new Student("生命在于运动","王五","17","男");
        clazz2Students.add(clazz2_Student3);
        Student clazz2_Student4 = new Student("生命在于运动","赵六","20","男");
        clazz2Students.add(clazz2_Student4);
        Student clazz2_Student5 = new Student("生命在于运动","马奇","18","女");
        clazz2Students.add(clazz2_Student5);
        clazz2.setStudents(clazz2Students);
        mClazzs.add(clazz2);

        //初始化三班
        Clazz clazz3 = new Clazz("三班","201503");
        List<Student> clazz3Students = new ArrayList<Student>();
        Student clazz3_Student1 = new Student("生命在于运动","张三","17","男");
        clazz3Students.add(clazz3_Student1);
        Student clazz3_Student2 = new Student("生命在于运动","李四","19","女");
        clazz3Students.add(clazz3_Student2);
        Student clazz3_Student3 = new Student("生命在于运动","王五","17","男");
        clazz3Students.add(clazz3_Student3);
        Student clazz3_Student4 = new Student("生命在于运动","赵六","20","男");
        clazz3Students.add(clazz3_Student4);
        Student clazz3_Student5 = new Student("生命在于运动","马奇","18","女");
        clazz3Students.add(clazz3_Student5);
        clazz3.setStudents(clazz3Students);
        mClazzs.add(clazz3);

        //初始化四班
        Clazz clazz4 = new Clazz("四班","201504");

        List<Student> clazz4Students = new ArrayList<Student>();
        Student clazz4_Student1 = new Student("生命在于运动","张三","17","男");
        clazz4Students.add(clazz4_Student1);
        Student clazz4_Student2 = new Student("生命在于运动","李四","19","女");
        clazz4Students.add(clazz4_Student2);
        Student clazz4_Student3 = new Student("生命在于运动","王五","17","男");
        clazz4Students.add(clazz4_Student3);
        Student clazz4_Student4 = new Student("生命在于运动","赵六","20","男");
        clazz4Students.add(clazz4_Student4);
        Student clazz4_Student5 = new Student("生命在于运动","马奇","18","女");
        clazz4Students.add(clazz4_Student5);
        clazz4.setStudents(clazz4Students);
        mClazzs.add(clazz4);
    }
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小_爽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值