Android开发——ExpandableListView控件使用详解
一、前言
ExpandableListView是ListView的子类,而与ListView的区别在于ExpandableListView对列表进行了分组,是一个可以扩展的、分层级的ListView。
二、具体代码的实现
1.主界面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">
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/elv_expandablelistview"
android:groupIndicator="@null"/>
</LinearLayout>
2.父类条目布局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="60dp"
android:background="#555555"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_parent_chapter"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textSize="24dp"
android:textStyle="bold"
android:textColor="#FFFFFF"/>
</LinearLayout>
3.子类条目布局XML代码
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="45dp"
android:id="@+id/tv_child_chapter"
android:textSize="24dp"
android:gravity="center_vertical"
android:textColor="#000000"
android:background="#E8E6E6">
</TextView>
4.分组条目bean的代码
//分组条目的bean
public class Chapter {
private int id;
private String name;
private List<ChapterItem> children = new ArrayList<>();
public Chapter() {
}
public Chapter(int id, String name) {
this.id = id;
this.name = name;
}
public void addChild(ChapterItem child){
children.add(child);
child.setPid(getId());
}
public void addChild(int id,String childName){
ChapterItem chapterItem=new ChapterItem(id,childName);
chapterItem.setPid(getId());
children.add(chapterItem);
}
public List<ChapterItem> getChildren() {
return children;
}
public void setChildren(List<ChapterItem> children) {
this.children = children;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
5.子类分组条目bean的代码
//子条目
public class ChapterItem {
private int id;
private String name;
private int pid;
public ChapterItem() {
}
public ChapterItem(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
}
6.adapter的代码
public class ChapterAdapter extends BaseExpandableListAdapter {
private Context mcontext;
private List<Chapter> mchapters;
private LayoutInflater minflater;
public ChapterAdapter(Context context, List<Chapter> chapters) {
mcontext = context;
mchapters = chapters;
minflater = LayoutInflater.from(context);
}
@Override
public int getGroupCount() {
return mchapters.size();
}
@Override
public int getChildrenCount(int i) {
return mchapters.get(i).getChildren().size();
}
@Override
public Object getGroup(int i) {
return mchapters.get(i);
}
@Override
public Object getChild(int i, int i1) {
return mchapters.get(i).getChildren().get(i1);
}
@Override
public long getGroupId(int i) {
return i;
}
@Override
public long getChildId(int i, int i1) {
return i1;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
ParentViewHolder vh_parent=null;
if(view == null){
view=minflater.inflate(R.layout.item_parent_chapter,viewGroup,false);
vh_parent=new ParentViewHolder();
vh_parent.tv_parent=view.findViewById(R.id.tv_parent_chapter);
view.setTag(vh_parent);
}else {
vh_parent=(ParentViewHolder)view.getTag();
}
Chapter chapter=mchapters.get(i);
vh_parent.tv_parent.setText(chapter.getName());
return view;
}
@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
ChildViewHolder vh_child;
if(view == null){
view=minflater.inflate(R.layout.item_child_chapter,viewGroup,false);
vh_child=new ChildViewHolder();
vh_child.tv_child=view.findViewById(R.id.tv_child_chapter);
view.setTag(vh_child);
}else {
vh_child=(ChildViewHolder)view.getTag();
}
vh_child.tv_child.setText(mchapters.get(i).getChildren().get(i1).getName());
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return true;
}
public static class ParentViewHolder{
TextView tv_parent;
}
public static class ChildViewHolder{
TextView tv_child;
}
}
7.导入条目内容的代码
public class ChapterLab {
//addchild的第二种方法
private static ChapterItem data4=new ChapterItem(4,"飞机场的10:30");
public static List<Chapter> datas(){
List<Chapter> chapters=new ArrayList<>();
Chapter data1=new Chapter(1,"陈奕迅的热门单曲");
Chapter data2=new Chapter(2,"方大同的热门单曲");
Chapter data3=new Chapter(3,"陶喆的热门单曲");
data1.addChild(11,"富士山下");
data1.addChild(12,"人来人往");
data1.addChild(13,"岁月如歌");
data2.addChild(14,"春风吹");
data2.addChild(15,"三人游");
data2.addChild(16,"特别的人");
data3.addChild(17,"流沙");
data3.addChild(18,"一念之间");
data3.addChild(19,"那个女孩");
data3.addChild(data4);
chapters.add(data1);
chapters.add(data2);
chapters.add(data3);
return chapters;
}
}
8.主activity的代码
public class Activity_ExpandableListView extends AppCompatActivity {
private ExpandableListView mexpandableListView;
private ChapterAdapter mchapterAdapter;
private List<Chapter> mchapters =new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_expandablelistview);
mexpandableListView=findViewById(R.id.elv_expandablelistview);
mchapters= ChapterLab.datas();
mchapterAdapter=new ChapterAdapter(this,mchapters);
mexpandableListView.setAdapter(mchapterAdapter);
init();
}
private void init() {
mexpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
Toast.makeText(Activity_ExpandableListView.this,"点击了"+i,Toast.LENGTH_SHORT).show();
return false;
}
});
mexpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {
Toast.makeText(Activity_ExpandableListView.this,"点击了"+i+"的"+i1,Toast.LENGTH_SHORT).show();
return false;
}
});
mexpandableListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int i) {
Toast.makeText(Activity_ExpandableListView.this,"折叠数据组"+i,Toast.LENGTH_SHORT).show();
}
});
mexpandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(int i) {
Toast.makeText(ActivityExpandableListView.this,"展开数据组"+i,Toast.LENGTH_SHORT).show();
}
});
mexpandableListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(Activity_ExpandableListView.this,"选择了"+i,Toast.LENGTH_SHORT).show();
}
});
}
}
三、实现效果
最终实现的效果为可扩展的列表,同时可以通过ExpandableListView里内置的点击事件添加各种功能,
设置分组的点击监听器:setOnGroupClickListener(OnGroupClickListener listener)
设置分组中子条目的点击监听器:setOnChildClickListener(OnChildClickListener listener)
设置分组收起的监听器:setOnGroupCollapseListener(OnGroupCollapseListener listener)
设置分组展开的监听器:setOnGroupExpandListener(OnGroupExpandListener listener)