一、什么是ExpandableListView?
ExpandableListView是可折叠的列表,它是ListView的子类, 在ListView的基础上它把应用中的列表项分为几组,每组里又可包含多个列表项。至于样子, 就像书籍的二级目录,他的用法与ListView非常相似,只是ExpandableListVivew显示的列表项 需由ExpandableAdapter提供。
二、ExpandableListView的常用属性
属性 | 主要作用 |
---|---|
android:divider | 指定各组之间的分隔条 |
android:dividerHeight | 指定各组之间的分隔条高度 |
android:childDivider | 指定各组内子类表项之间的分隔条 |
android:childIndicator | 显示在子列表旁边的Drawable对象 |
android:childIndicatorLeft | 子列表项指示符的左边约束位置 |
android:childIndicatorRight | 子列表项指示符的右边约束位置 |
android:groupIndicator | 显示在组列表旁边的Drawable对象 |
android:indicatorLeft | 组列表项指示器的左边约束位置 |
android:indicatorRight | 组列表项指示器的右边约束位置 |
三、简单的Demo
1.主界面layout_book_directory.cml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_test_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text="目录"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ExpandableListView
android:id="@+id/elv_mu_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tv_test_title" />
</androidx.constraintlayout.widget.ConstraintLayout>
2.一级目录界面layout_item_parent.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tv_parent_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:textColor="@android:color/holo_blue_dark"
android:textSize="18sp" />
3、二级目录界面layout_item_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:padding="10dp">
<CheckBox
android:id="@+id/cb_child"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv_child_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:textColor="@android:color/holo_blue_dark"
android:textSize="18sp" />
</LinearLayout>
4.JavaBean
package com.example.myapplication.bean;
import java.util.ArrayList;
import java.util.List;
public class DirectoryBean {
private String title;
private List<DirectoryBean> childDirectory = new ArrayList<>();
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List<DirectoryBean> getChildDirectory() {
return childDirectory;
}
public void setChildDirectory(List<DirectoryBean> childDirectory) {
this.childDirectory = childDirectory;
}
@Override
public String toString() {
return "DirectoryBean{" +
"title='" + title + '\'' +
", childDirectory=" + childDirectory.toString() +
'}';
}
}
5.ExpandableListView对应的适配器BookDirectoryAdapter
public class BookDirectoryAdapter extends BaseExpandableListAdapter {
private Context mContext;
private List<DirectoryBean> directory;
public BookDirectoryAdapter(Context mContext,List<DirectoryBean> directory) {
super();
this.directory = directory;
this.mContext = mContext;
}
/**
* 获取一级item个数
*/
@Override
public int getGroupCount() {
return directory.size();
}
/**
* 获取w位置为grupPosition的二级item个数
*/
@Override
public int getChildrenCount(int groupPosition) {
return directory.get(groupPosition).getChildDirectory().size();
}
/**
*获取一级目录显示的数据
*/
@Override
public Object getGroup(int groupPosition) {
return directory.get(groupPosition);
}
/**
*获取二级目录显示的数据
*/
@Override
public Object getChild(int groupPosition, int childPosition) {
return directory.get(groupPosition).getChildDirectory().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) {
ViewHolder_parent groupHolder;
if(convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_item_parent, parent, false);
groupHolder = new ViewHolder_parent();
groupHolder.title= (TextView) convertView.findViewById(R.id.tv_parent_title);
convertView.setTag(groupHolder);
}else{
groupHolder = (ViewHolder_parent) convertView.getTag();
}
groupHolder.title.setText(directory.get(groupPosition).getTitle());
return convertView;
}
/**
* 编写二级目录的界面
*/
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolder_child childHolder;
if(convertView == null){
convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_item_child, parent, false);
childHolder = new ViewHolder_child();
childHolder.title= (TextView) convertView.findViewById(R.id.tv_child_title);
childHolder.check = (CheckBox) convertView.findViewById(R.id.cb_child);
convertView.setTag(childHolder);
}else{
childHolder = (ViewHolder_child) convertView.getTag();
}
childHolder.title.setText(directory.get(groupPosition).getChildDirectory().get(childPosition).getTitle());
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
class ViewHolder_parent{
TextView title;
}
class ViewHolder_child{
TextView title;
CheckBox check;
}
}
6.主活动BookDirectoryActivity
package com.example.myapplication.activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.example.myapplication.R;
import com.example.myapplication.adapter.BookDirectoryAdapter;
import com.example.myapplication.bean.DirectoryBean;
import java.util.ArrayList;
import java.util.List;
import androidx.appcompat.app.AppCompatActivity;
public class BookDirectoryActivity extends AppCompatActivity {
private TextView tv;
private ExpandableListView elv;
private List<DirectoryBean> directory = new ArrayList<>();
private BookDirectoryAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book_directory);
initData();
initView();
// up();
}
/**
*初始化数据
*/
private void initData() {
DirectoryBean directory_1 = new DirectoryBean();
directory_1.setTitle("水果");
List<DirectoryBean> DirectoryList1 = new ArrayList<>();
DirectoryBean directory_1_1 = new DirectoryBean();
directory_1_1.setTitle("苹果");
DirectoryList1.add(directory_1_1);
DirectoryBean directory_1_2 = new DirectoryBean();
directory_1_2.setTitle("香蕉");
DirectoryList1.add(directory_1_2);
DirectoryBean directory_1_3 = new DirectoryBean();
directory_1_3.setTitle("菠萝");
DirectoryList1.add(directory_1_3);
directory_1.setChildDirectory(DirectoryList1);
directory.add(directory_1);
DirectoryBean directory_2 = new DirectoryBean();
directory_2.setTitle("蔬菜");
List<DirectoryBean> DirectoryList2 = new ArrayList<>();
DirectoryBean directory_2_1 = new DirectoryBean();
directory_2_1.setTitle("包菜");
DirectoryList2.add(directory_2_1);
DirectoryBean directory_2_2 = new DirectoryBean();
directory_2_2.setTitle("胡萝卜");
DirectoryList2.add(directory_2_2);
directory_2.setChildDirectory(DirectoryList2);
directory.add(directory_2);
DirectoryBean directory_3 = new DirectoryBean();
directory_3.setTitle("粮食");
List<DirectoryBean> DirectoryList3 = new ArrayList<>();
DirectoryBean directory_3_1 = new DirectoryBean();
directory_3_1.setTitle("大米");
DirectoryList3.add(directory_3_1);
DirectoryBean directory_3_2 = new DirectoryBean();
directory_3_2.setTitle("小麦");
DirectoryList3.add(directory_3_2);
directory_3.setChildDirectory(DirectoryList3);
directory.add(directory_3);
}
private void initView() {
tv = findViewById(R.id.tv_test_title);
elv = findViewById(R.id.elv_mu_content);
adapter =new BookDirectoryAdapter(getBaseContext(),directory);
elv.setAdapter(adapter);
}
/**
* 默认二级目录全展开
*/
private void up(){
for (int i = 0; i < adapter.getGroupCount(); i++) {
elv.expandGroup(i);
}
//禁止收缩
elv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
return true;
}
});
}
@Override
public void onPointerCaptureChanged(boolean hasCapture) {
}
}
7.运行结果截图