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,避免滑动冲突,其中列表数据处理也要特别小心。
阅读全文
0 0
- ExpandableListView的使用
- ExpandableListView的使用
- Android ExpandableListView的使用
- Android ExpandableListView的使用
- 转载:ExpandableListView的使用
- ExpandableListView的使用
- expandablelistview的使用
- Android ExpandableListView的使用
- ExpandableListView组件的使用
- ExpandableListView的基本使用
- ExpandableListView的使用
- ExpandableListView的使用示例
- ExpandableListView的使用
- ExpandableListView的使用总结
- Android ExpandableListView的使用
- ExpandableListView的使用
- Android ExpandableListView的使用
- ExpandableListview的使用介绍
- 位运算训练05—输入一个32位的整数a,使用按位异或^运算,生成一个新的32位整数b; 使得该整数b的每一位等于原整数a中该位左右两边两个bit位的异或结果
- 任卫红:关键信息基础设施的等级保护
- ajaxfileupload.js异步上传文件插件(完整demo)
- Android 网络教程: 开始
- Eclipse搭建Python编码环境
- ExpandableListView的使用
- maven 多module环境下打包出现boot-inf的解决方案
- c++ const引用与const指针
- Qt简介
- 拒绝不合理需求的4个方法
- centos7 安装nginx+tomcat+java+mysql运行环境
- Android连接错误,在release环境下不会出现错误,但debug下错误
- 真机调试打印日志
- WebStrom中项目avalon框架中vm赋值的问题?