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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)