ExpandableListView的使用

来源:互联网 发布:淘宝教育入口 编辑:程序博客网 时间:2024/06/18 11:22

效果如图所示:

直接上干货:
1.activity_home的布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.lotus.expandablelistdemo.HomeActivity">    <ExpandableListView        android:id="@+id/expandableListView"        android:layout_width="match_parent"        android:layout_height="match_parent"/></LinearLayout>

2.item_group的布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@color/app_white">    <TextView        android:layout_width="wrap_content"        android:layout_height="45dp"        android:id="@+id/tv_group"        android:textColor="@color/colorPrimary"        android:gravity="center"        android:textSize="18sp"        android:layout_marginLeft="40dp"/></LinearLayout>

3.item_child的布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <TextView              android:background="@color/app_gray"        android:gravity="center"        android:textSize="18sp"        android:textColor="@color/app_white"        android:id="@+id/tv_child"        android:layout_width="match_parent"        android:layout_height="45dp" />    <View        android:layout_width="match_parent"        android:layout_height="1dp"        android:background="@color/app_line"/>    <com.lotus.expandablelistdemo.MeasureListView        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/listView"/></LinearLayout>

自定义MeasureListView extends ListView:

// ScrollView中嵌套Listview会有滑动冲突,且不清楚listview的高度是多少,则listview只会显示一行数据// (listview嵌套listview也是这样的)// 重写onMeasure方法,直接根据listview的高度绘制listview ,使listview不可滑动,且内容完全显示出来  public class MeasureListView extends ListView {    public MeasureListView(Context context) {        super(context);    }    public MeasureListView(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,                MeasureSpec.AT_MOST);        super.onMeasure(widthMeasureSpec, expandSpec);    }}

4.item_child_list的布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="horizontal" android:layout_width="match_parent"    android:layout_height="wrap_content">    <TextView        android:gravity="center_vertical"        android:layout_marginLeft="20dp"        android:id="@+id/tv_name"        android:layout_width="0dp"        android:layout_weight="1"        android:layout_height="45dp" />    <View        android:layout_width="0.2dp"        android:layout_height="match_parent"        android:background="@color/app_line"/>    <TextView        android:layout_marginLeft="20dp"        android:layout_marginRight="20dp"        android:gravity="center_vertical"        android:id="@+id/tv_value"        android:layout_width="0dp"        android:layout_weight="1"        android:layout_height="45dp" /></LinearLayout>

5.GroupMode类为存储列表数据的实体类:

import java.io.Serializable;import java.util.List;public class GroupMode implements Serializable {    private String year;    private String date;    private String classAndGgrade;    private List<Student> students;    public String getYear() {        return year;    }    public void setYear(String year) {        this.year = year;    }    public String getDate() {        return date;    }    public void setDate(String date) {        this.date = date;    }    public String getClassAndGgrade() {        return classAndGgrade;    }    public void setClassAndGgrade(String classAndGgrade) {        this.classAndGgrade = classAndGgrade;    }    public List<Student> getStudents() {        return students;    }    public void setStudents(List<Student> students) {        this.students = students;    }    public static class Student implements Serializable{        private String name;        private List<Grade> grades;        public String getName() {            return name;        }        public void setName(String name) {            this.name = name;        }        public List<Grade> getGrades() {            return grades;        }        public void setGrades(List<Grade> grades) {            this.grades = grades;        }        public static class Grade implements Serializable{            private String object;            private String grade;            public String getObject() {                return object;            }            public void setObject(String object) {                this.object = object;            }            public String getGrade() {                return grade;            }            public void setGrade(String grade) {                this.grade = grade;            }        }    }}

6.封装BaseAdapter extends SimpleAdapter 方便重复使用:

import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.SimpleAdapter;import java.util.ArrayList;import java.util.List;public abstract class BaseAdapter<T> extends SimpleAdapter {    public Context mContext;    private int mFirstPageIndex = 0;    protected List<T> mListData = new ArrayList<T>();    protected abstract View getItemView(int position, View convertView,                                        ViewGroup parent);    public BaseAdapter(Context context) {        super(context, null, 0, null, null);        this.mContext = context;        this.mFirstPageIndex = 0;    }    public BaseAdapter(Context context, int firstPageIndex) {        super(context, null, 0, null, null);        this.mContext = context;        this.mFirstPageIndex = firstPageIndex;    }    public void initData(int pageIndex, List<T> data) {        if (pageIndex == mFirstPageIndex) {            mListData.clear();        }        if (null != data) {            mListData.addAll(data);        }        this.notifyDataSetChanged();    }    public void deleteItem(int positon) {        if ( mListData != null && mListData.size()>0 ) {            if (positon < mListData.size()) {                mListData.remove(positon);                notifyDataSetChanged();            }        }    }    @Override    public int getCount() {        return mListData.size();    }    @Override    public T getItem(int position) {        if (position > -1 && position < mListData.size()) {            return mListData.get(position);        }        return null;    }    @Override    public boolean isEnabled(int position) {        return true;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        return getItemView(position, convertView, parent);    }}

7.ChildAdapter的具体代码:

import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import butterknife.BindView;import butterknife.ButterKnife;public class ChildAdapter extends BaseAdapter<GroupMode.Student.Grade> {    public ChildAdapter(Context context) {        super(context);    }    @Override    protected View getItemView(int position, View convertView, ViewGroup parent) {        ViewHolder holder;        if (convertView == null) {            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_child_list, parent, false);            holder = new ViewHolder(convertView);            convertView.setTag(holder);        }else {            holder = (ViewHolder) convertView.getTag();        }        GroupMode.Student.Grade item = getItem(position);        holder.tvName.setText( item.getObject() );        holder.tvValue.setText( item.getGrade());        return convertView;    }    static class ViewHolder {        @BindView(R.id.tv_name)        TextView tvName;        @BindView(R.id.tv_value)        TextView tvValue;        ViewHolder(View view) {            ButterKnife.bind(this, view);        }    }}

8.GroupAdapter的具体代码:

import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseExpandableListAdapter;import android.widget.TextView;import java.util.ArrayList;import java.util.List;import butterknife.BindView;import butterknife.ButterKnife;public class GroupAdapter extends BaseExpandableListAdapter {    public final static int PAGE_START=0;    private Context context;    private ArrayList<GroupMode> datas;    public GroupAdapter(Context context, ArrayList<GroupMode> datas) {        this.context = context;        this.datas=datas;    }    public void putData(ArrayList<GroupMode> list) {        datas = list;        notifyDataSetChanged();//更新列表数据    }    @Override    public int getGroupCount() {        return datas.size();    }    @Override    public int getChildrenCount(int groupPosition) {        return datas.get(groupPosition).getStudents().size();    }    @Override    public Object getGroup(int groupPosition) {        return datas.get(groupPosition);    }    @Override    public Object getChild(int groupPosition, int childPosition) {        return datas.get(groupPosition).getStudents().get(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 isExpanded, View convertView, ViewGroup parent) {        if (convertView == null) {            convertView = LayoutInflater.from(context).inflate(R.layout.item_group, parent, false);        }        TextView tvGroup = (TextView) convertView.findViewById(R.id.tv_group);        tvGroup.setText(datas.get(groupPosition).getYear() + "年");        return convertView;    }    @Override    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {        ViewHolder holder;        if (convertView == null) {            convertView = LayoutInflater.from(context).inflate(R.layout.item_child, parent, false);            holder = new ViewHolder(convertView);            convertView.setTag(holder);        }else{            holder = (ViewHolder) convertView.getTag();        }        GroupMode.Student student = datas.get(groupPosition).getStudents().get(childPosition);        holder.tvChild.setText(student.getName());        List<GroupMode.Student.Grade> gradeArrayList = student.getGrades();        if (gradeArrayList!=null && gradeArrayList.size()!=0){            holder.listView.setVisibility(View.VISIBLE);            holder.listView.setDividerHeight(1);            ChildAdapter childAdapter = new ChildAdapter(context);            holder.listView.setAdapter(childAdapter);            childAdapter.initData(PAGE_START,gradeArrayList);        }else {            holder.listView.setVisibility(View.GONE);        }        return convertView;    }    @Override    public boolean isChildSelectable(int groupPosition, int childPosition) {        return true;    }    static class ViewHolder {        @BindView(R.id.tv_child)        TextView tvChild;        @BindView(R.id.listView)        MeasureListView listView;        ViewHolder(View view) {            ButterKnife.bind(this, view);        }    }}

9.HomeActivity:

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ExpandableListView;import java.util.ArrayList;public class HomeActivity extends AppCompatActivity {    private ExpandableListView expandableListView;    private GroupAdapter adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_home);        expandableListView = ( ExpandableListView) this.findViewById(R.id.expandableListView);        //单科成绩        GroupMode.Student.Grade grade1 = new GroupMode.Student.Grade();        grade1.setObject("语文");        grade1.setGrade("99");        GroupMode.Student.Grade grade2 = new GroupMode.Student.Grade();        grade2.setObject("数学");        grade2.setGrade("99");        GroupMode.Student.Grade grade3 = new GroupMode.Student.Grade();        grade3.setObject("外语");        grade3.setGrade("99");        GroupMode.Student.Grade grade4 = new GroupMode.Student.Grade();        grade4.setObject("物理");        grade4.setGrade("99");        GroupMode.Student.Grade grade5 = new GroupMode.Student.Grade();        grade5.setObject("化学");        grade5.setGrade("99");        GroupMode.Student.Grade grade6 = new GroupMode.Student.Grade();        grade6.setObject("生物");        grade6.setGrade("99");        GroupMode.Student.Grade grade7 = new GroupMode.Student.Grade();        grade7.setObject("体育");        grade7.setGrade("99");        //成绩列表        ArrayList<GroupMode.Student.Grade> gradeArrayList = new ArrayList<>();        gradeArrayList.add( grade1);        gradeArrayList.add( grade2);        gradeArrayList.add( grade3);        gradeArrayList.add( grade4);        gradeArrayList.add( grade5);        gradeArrayList.add( grade6);        gradeArrayList.add( grade7);        //单个学生        GroupMode.Student student1 = new GroupMode.Student();        student1.setName("小红");        student1.setGrades( gradeArrayList);        GroupMode.Student student2 = new GroupMode.Student();        student2.setName("丽丽");        student2.setGrades( gradeArrayList);        GroupMode.Student student3 = new GroupMode.Student();        student3.setName("亮亮");        student3.setGrades( gradeArrayList);        //学生列表        ArrayList<GroupMode.Student> studentArrayList = new ArrayList<>();        studentArrayList.add(student1);        studentArrayList.add(student2);        studentArrayList.add(student3);        //单个班级        GroupMode class1 = new GroupMode();        class1.setYear("2017");        class1.setClassAndGgrade("一年级一班");        class1.setDate("2017/06/30");        class1.setStudents( studentArrayList );        GroupMode class2 = new GroupMode();        class2.setYear("2017");        class2.setClassAndGgrade("二年级一班");        class2.setDate("2017/06/30");        class2.setStudents( studentArrayList );        GroupMode class3 = new GroupMode();        class3.setYear("2017");        class3.setClassAndGgrade("三年级一班");        class3.setDate("2017/06/30");        class3.setStudents( studentArrayList );        //班级列表        ArrayList<GroupMode> classArrayList = new ArrayList<>();        classArrayList.add( class1);        classArrayList.add( class2);        classArrayList.add( class3);        if (classArrayList!=null&&classArrayList.size()!=0){            adapter = new GroupAdapter(HomeActivity.this,classArrayList);            expandableListView.setAdapter(adapter);        }    }}

注:
ExpandableListView的使用和ListView的使用差别不太大,只是多了一层而已,分清楚group和child,避免滑动冲突,其中列表数据处理也要特别小心。

原创粉丝点击