Android学习之ExpandableListView

Android学习之ExpandableListView,第1张

概述什么是ExpandableListViewExpandableListView是扩展的ListView,继承自ListView;ExpandableListView可以实现点击展开列表,再点击收缩回去的效果。ExpandableListView的使用首先需要在主布局文件中声明ExpandableListView;<?xmlversion="1.0"encoding="utf-8"?><LinearLayo 什么是ExpandableListVIEw

ExpandableListVIEw是扩展的ListVIEw,继承自ListVIEw;ExpandableListVIEw可以实现点击展开列表,再点击收缩回去的效果。

ExpandableListVIEw的使用

首先需要在主布局文件中声明ExpandableListVIEw;

<?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=".TestActivity3"    androID:orIEntation="vertical">		<!--        indicatorleft:指示符的左边界        indicatorRight: 指示符的右边界        groupIndicator:设置指示符    -->    <ExpandableListVIEw        androID:ID="@+ID/ID_elv1"        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"         androID:groupIndicator="@drawable/group_indicator"        androID:indicatorRight="40dp"        androID:indicatorleft="10dp"/></linearLayout>

group_indicator.xml文件,指定不同状态下的样式

<?xml version="1.0" enCoding="utf-8"?><selector xmlns:androID="http://schemas.androID.com/apk/res/androID">    <!--展开状态-->    <item androID:drawable="@drawable/indicator_expand" androID:state_expanded="true">true</item>    <!--非展开状态-->    <item androID:drawable="@drawable/indicator_collapse"></item></selector>

新建Chapter类和ChapterItem类;Chapter代表分组,ChapterItem代表分组中的子选项;

public class Chapter {    private int ID;    private String name;	//存储分组中的的子选项    private List<ChapterItem> chapterItemList = new ArrayList<>();    public Chapter() {    }    public Chapter(int ID, String name) {        this.ID = ID;        this.name = name;    }	//向分组中添加子选项    public voID addChapterItem(ChapterItem chapterItem) {        chapterItem.setPID(getID());        chapterItemList.add(chapterItem);    }	//向分组中添加子选项    public voID addChapterItem(int cID, String cname) {        ChapterItem chapterItem = new ChapterItem(cID, cname);        chapterItem.setPID(getID());    }    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 List<ChapterItem> getChapterItemList() {        return chapterItemList;    }    public voID setChapterItemList(List<ChapterItem> chapterItemList) {        this.chapterItemList = chapterItemList;    }}

ChapterItem类

public class ChapterItem {    private String name;    //子选项的ID    private int ID;    //子选项所在分组的ID    private int pID;    public ChapterItem() {    }    public ChapterItem(int ID, String name) {        this.ID = ID;        this.name = name;    }    public String getname() {        return name;    }    public voID setname(String name) {        this.name = name;    }    public int getID() {        return ID;    }    public voID setID(int ID) {        this.ID = ID;    }    public int getPID() {        return pID;    }    public voID setPID(int pID) {        this.pID = pID;    }}

ChapterLab类,使用此类模拟添加数据

public class ChapterLab {    public static List<Chapter> getGenerateMockDats() {        List<Chapter> datas = new ArrayList<>();        Chapter root1 = new Chapter(1, "AndroID");        Chapter root2 = new Chapter(1, "Java");        Chapter root3 = new Chapter(1, "C/C++");        Chapter root4 = new Chapter(1, "Python");        root1.addChapterItem(new ChapterItem(1,"EventBus"));        root1.addChapterItem(new ChapterItem(2, "GreenDao"));        root1.addChapterItem(new ChapterItem(3, "GrIDle"));        root1.addChapterItem(new ChapterItem(4, "Spinner"));        root2.addChapterItem(new ChapterItem(5,"spring"));        root2.addChapterItem(new ChapterItem(6, "springmvc"));        root2.addChapterItem(new ChapterItem(7, "mybatis"));        root3.addChapterItem(new ChapterItem(8, "hibernate"));        root3.addChapterItem(new ChapterItem(9,"STL"));        root3.addChapterItem(new ChapterItem(10, "IO"));        root3.addChapterItem(new ChapterItem(11, "指针"));        root3.addChapterItem(new ChapterItem(12, "结构体"));        root4.addChapterItem(new ChapterItem(13,"爬虫"));        root4.addChapterItem(new ChapterItem(14, "数据分析"));        root4.addChapterItem(new ChapterItem(15, "AI"));        root4.addChapterItem(new ChapterItem(16, "人工智能"));        datas.add(root1);        datas.add(root2);        datas.add(root3);        datas.add(root4);        return datas;    }}

item_parent_chapter.xml文件,父选项布局文件

<?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="56dp"    androID:background="#86b2f9">    <TextVIEw        androID:ID="@+ID/ID_tv_parent"        androID:layout_wIDth="match_parent"        androID:layout_height="match_parent"        androID:gravity="center_vertical"        androID:text="AndroID"        androID:textSize="24dp"        androID:textStyle="bold"/></linearLayout>

item_child_layoutu.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="40dp"    androID:layout_gravity="center_vertical"    androID:textSize="16dp"    androID:ID="@+ID/tv_item"></TextVIEw>

Chapteradapter数据适配类,这个类继承了Baseexpandablelistadapter并重写了方法,

public class Chapteradapter extends Baseexpandablelistadapter {	//分组的数据    private List<Chapter> datas;    private LayoutInflater inflater;    private Context mContext;    public Chapteradapter(Context context, List<Chapter> datas) {        this.datas = datas;        this.mContext = context;        inflater = LayoutInflater.from(context);    }    /**     * 获取分组的个数     * @return     */    @OverrIDe    public int getGroupCount() {        return datas.size();    }    /**     * 获取指定分组中子选项的个数     * @param groupposition     * @return     */    @OverrIDe    public int getChildrenCount(int groupposition) {        return datas.get(groupposition).getChapterItemList().size();    }    /**     * 获取指定分组的数据     * @param groupposition     * @return     */    @OverrIDe    public Object getGroup(int groupposition) {        return datas.get(groupposition);    }    /**     * 获取指定分组中的子选项的数据     * @param groupposition     * @param childposition     * @return     */    @OverrIDe    public Object getChild(int groupposition, int childposition) {        return datas.get(groupposition).getChapterItemList().get(childposition);    }    /**     * 获取指定分组的ID,这个ID必须是唯一的,可以使用分组的position     * @param groupposition     * @return     */    @OverrIDe    public long getGroupID(int groupposition) {        return groupposition;    }    /**     * 获取子选项的ID,这个ID必须是唯一的,不能使用子条目的position     * @param groupposition     * @param childposition     * @return     */    @OverrIDe    public long getChildID(int groupposition, int childposition) {        return childposition;    }    /**     * 分组和子选项是否持有稳定的ID,就是说底层数据的改变会不会影响到它们     * @return     */    @OverrIDe    public boolean hasStableIDs() {        return false;    }    /**     * 获取显示指定分组的视图     * @param groupposition     * @param isExpanded     * @param convertVIEw     * @param parent     * @return     */    @OverrIDe    public VIEw getGroupVIEw(int groupposition, boolean isExpanded, VIEw convertVIEw, VIEwGroup parent) {        ParentVIEwHolder parentVIEwHolder = null;        if (convertVIEw == null) {            convertVIEw = inflater.inflate(R.layout.item_parent_chapter, parent, false);            parentVIEwHolder = new ParentVIEwHolder();            parentVIEwHolder.tvname = convertVIEw.findVIEwByID(R.ID.ID_tv_parent);                     convertVIEw.setTag(parentVIEwHolder);        } else {            parentVIEwHolder = (ParentVIEwHolder) convertVIEw.getTag();        }        Chapter chapter = datas.get(groupposition);        parentVIEwHolder.tvname.setText(chapter.getname());          return convertVIEw;    }    /**     * 获取指定分组中的指定子选项的视图     * @param groupposition     * @param childposition     * @param isLastChild     * @param convertVIEw     * @param parent     * @return     */    @OverrIDe    public VIEw getChildVIEw(int groupposition, int childposition, boolean isLastChild, VIEw convertVIEw, VIEwGroup parent) {        ChildVIEwHolder childVIEwHolder = null;        if (convertVIEw == null) {            convertVIEw = inflater.inflate(R.layout.item_child_layout, parent, false);            childVIEwHolder = new ChildVIEwHolder();            childVIEwHolder.tvname = convertVIEw.findVIEwByID(R.ID.tv_item);            convertVIEw.setTag(childVIEwHolder);        } else {            childVIEwHolder = (ChildVIEwHolder) convertVIEw.getTag();        }        ChapterItem chapterItem = datas.get(groupposition).getChapterItemList().get(childposition);        childVIEwHolder.tvname.setText(chapterItem.getname());        return convertVIEw;    }    /**     * 指定位置上的子元素是否可选中,返回true才会相应点击事件     * @param groupposition     * @param childposition     * @return     */    @OverrIDe    public boolean isChildSelectable(int groupposition, int childposition) {        return true;    }    public static class ParentVIEwHolder {        TextVIEw tvname;      }    public static class ChildVIEwHolder {        TextVIEw tvname;    }}

主Activity类

public class TestActivity3 extends AppCompatActivity {    private ExpandableListVIEw expandableListVIEw;    private Chapteradapter chapteradapter;    private List<Chapter> dataList;    private static final String TAG = "TestActivity3";    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_test3);        initVIEws();        initEvents();    }    public voID initVIEws() {        expandableListVIEw = findVIEwByID(R.ID.ID_elv1);        dataList = ChapterLab.getGenerateMockDats();        chapteradapter = new Chapteradapter(this,dataList);        expandableListVIEw.setAdapter(chapteradapter);    }    public voID initEvents() {    	//设置子选项被点击监听事件        expandableListVIEw.setonChildClickListener(new ExpandableListVIEw.OnChildClickListener() {            @OverrIDe            public boolean onChildClick(ExpandableListVIEw parent, VIEw v, int groupposition, int childposition, long ID) {                Log.d(TAG, "onChildClick: " + groupposition + " " + childposition + " " + ID);                return false;            }        });		//设置分组选项被点击监听事件        expandableListVIEw.setonGroupClickListener(new ExpandableListVIEw.OnGroupClickListener() {            @OverrIDe            public boolean onGroupClick(ExpandableListVIEw parent, VIEw v, int groupposition, long ID) {                Log.d(TAG, "onGroupClick: " + groupposition + " " + ID);                return false;            }        });		//设置折叠时的监听事件        expandableListVIEw.setonGroupCollapseListener(new ExpandableListVIEw.OnGroupCollapseListener() {            @OverrIDe            public voID onGroupCollapse(int groupposition) {                Log.d(TAG, "onGroupCollapse: " + groupposition);            }        });		//设置展开时的监听事件        expandableListVIEw.setonGroupExpandListener(new ExpandableListVIEw.OnGroupExpandListener() {            @OverrIDe            public voID onGroupExpand(int groupposition) {                Log.d(TAG, "onGroupExpand: " + groupposition);            }        });    }}

运行后的效果:

ExpandableListVIEw自带的指示器的效果不好,所以更多情况下我们会选择自定义一个指示器。
修改item_parent_chapter.xml文件,添加一个ImageVIEw控件作为指示符

<?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="56dp"    androID:background="#86b2f9">  <ImageVIEw        androID:ID="@+ID/ID_iv_indicator"        androID:layout_wIDth="24dp"        androID:layout_gravity="center_vertical"        androID:layout_marginRight="4dp"        androID:background="@drawable/group_indicator"        androID:layout_height="24dp"/>    <TextVIEw        androID:ID="@+ID/ID_tv_parent"        androID:layout_wIDth="match_parent"        androID:layout_height="match_parent"        androID:gravity="center_vertical"        androID:text="AndroID"        androID:textSize="24dp"        androID:textStyle="bold"/></linearLayout>

修改主界面布局文件中ExpandableListVIEw的androID:groupIndicator属性为@null

<?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=".TestActivity3"    androID:orIEntation="vertical">    <!--        indicatorleft: 指示符的左边约束距离        indicatorRight:指示符的右边约束距离        groupIndicator:设置指示    -->    <ExpandableListVIEw        androID:ID="@+ID/ID_elv1"        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:groupIndicator="@null"        androID:indicatorRight="40dp"        androID:indicatorleft="10dp"/></linearLayout>

修改group_indicator.xml文件为

<?xml version="1.0" enCoding="utf-8"?><selector xmlns:androID="http://schemas.androID.com/apk/res/androID">    <!--当使用ImageVIEw来代替indicator时,使用这个-->    <item androID:drawable="@drawable/indicator_expand" androID:state_selected="true">true</item>    <!--非展开状态-->    <item androID:drawable="@drawable/indicator_collapse"></item></selector>

修改Chapteradapter类中的中的getGroupVIEw方法和ParentVIEwHolder类为以下所示的样子,

@OverrIDe    public VIEw getGroupVIEw(int groupposition, boolean isExpanded, VIEw convertVIEw, VIEwGroup parent) {        ParentVIEwHolder parentVIEwHolder = null;        if (convertVIEw == null) {            convertVIEw = inflater.inflate(R.layout.item_parent_chapter, parent, false);            parentVIEwHolder = new ParentVIEwHolder();            parentVIEwHolder.tvname = convertVIEw.findVIEwByID(R.ID.ID_tv_parent);            parentVIEwHolder.imageVIEw = convertVIEw.findVIEwByID(R.ID.ID_iv_indicator);            convertVIEw.setTag(parentVIEwHolder);        } else {            parentVIEwHolder = (ParentVIEwHolder) convertVIEw.getTag();        }        Chapter chapter = datas.get(groupposition);        parentVIEwHolder.tvname.setText(chapter.getname());        parentVIEwHolder.imageVIEw.setSelected(isExpanded);        return convertVIEw;    }java
    public static class ParentVIEwHolder {        TextVIEw tvname;        ImageVIEw imageVIEw;    }

运行后效果如图:

总结

以上是内存溢出为你收集整理的Android学习之ExpandableListView全部内容,希望文章能够帮你解决Android学习之ExpandableListView所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1016524.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存