Android开发——ExpandableListView控件使用详解

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)


在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值