Android ExpandableListView的简单使用

一、什么是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.运行结果截图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值