• 【Android】扩展BaseExpandableListAdpter实现ExpandableAdapter


    今天分享如何扩展BaseExpandableListAdpter实现ExpandableAdapter,很简单的一个例子。

    效果示例:

     

    核心是重写BaseExpandableListAdpter,其中BaseExpandableListAdpter则分成了两部分:组和子列表,要注意的是,重写isChildSelectable()方法需要返回true,不然不会触发 子Item的点击事件!

    XML代码分享

    主xml文件

    1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:tools="http://schemas.android.com/tools"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:padding="5dp"
    6. tools:context=".MainActivity">
    7. <ExpandableListView
    8. android:id="@+id/exlist_lol"
    9. android:layout_width="match_parent"
    10. android:layout_height="match_parent"
    11. android:childDivider="#E02D2F" />
    12. RelativeLayout>

    父xml文件

    1. "1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="horizontal"
    6. android:padding="5dp">
    7. <TextView
    8. android:id="@+id/tv_group_name"
    9. android:layout_width="match_parent"
    10. android:layout_height="56dp"
    11. android:gravity="center_vertical"
    12. android:paddingLeft="30dp"
    13. android:text="Parent"
    14. android:textStyle="bold"
    15. android:textSize="20sp" />
    16. LinearLayout>

    子xml文件

    1. "1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="horizontal"
    6. android:padding="5dp">
    7. <TextView
    8. android:id="@+id/tv_name"
    9. android:layout_width="wrap_content"
    10. android:layout_height="wrap_content"
    11. android:layout_marginLeft="15dp"
    12. android:layout_marginTop="15dp"
    13. android:focusable="false"
    14. android:text="child"
    15. android:textSize="18sp" />
    16. <ImageView
    17. android:id="@+id/img_icon"
    18. android:layout_width="38dp"
    19. android:layout_height="47dp"
    20. android:layout_alignParentRight="true"
    21. android:layout_centerInParent="true"
    22. android:paddingRight="10dp"
    23. android:src="@drawable/arr_right" />
    24. LinearLayout>

    Activity代码分享

    1. import android.content.Context;
    2. import android.content.res.Resources;
    3. import android.os.Bundle;
    4. import android.view.View;
    5. import android.widget.ExpandableListView;
    6. import android.widget.Toast;
    7. import androidx.appcompat.app.AppCompatActivity;
    8. import java.util.ArrayList;
    9. public class MainActivity extends AppCompatActivity {
    10. private ArrayList gData = null;
    11. private ArrayList> iData = null;
    12. private ArrayList lData = null;
    13. private Context mContext;
    14. private ExpandableListView exlist_lol;
    15. private MyBaseExpandableListAdapter myAdapter = null;
    16. @Override
    17. protected void onCreate(Bundle savedInstanceState) {
    18. super.onCreate(savedInstanceState);
    19. setContentView(R.layout.activity_main);
    20. mContext = MainActivity.this;
    21. exlist_lol = (ExpandableListView) findViewById(R.id.exlist_lol);
    22. //数据准备
    23. gData = new ArrayList();
    24. iData = new ArrayList>();
    25. gData.add(new Group("Subject"));
    26. lData = new ArrayList();
    27. Resources res =getResources();
    28. String[] subject=res.getStringArray(R.array.subject);
    29. for(int i=0;i
    30. {
    31. lData.add(new Item(R.drawable.arr_right,subject[i])); //值得说明的是,这里的数据源于项目中的values/list.xml,同理,一级目录也可以用这样的方式赋值
    32. }
    33. iData.add(lData);
    34. myAdapter = new MyBaseExpandableListAdapter(gData,iData,mContext);
    35. exlist_lol.setAdapter(myAdapter);
    36. //为列表设置点击事件
    37. exlist_lol.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
    38. @Override
    39. public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
    40. Toast.makeText(mContext, "你点击了:" + iData.get(groupPosition).get(childPosition).getiName(), Toast.LENGTH_SHORT).show();
    41. return true;
    42. }
    43. });
    44. }
    45. }

    values下的list.xml(Tip:像一般的下拉框Spinner也可以读取xml资源)

    1. "1.0" encoding="utf-8"?>
    2. <resources>
    3.    <string-array name="subject">
    4.    <item>Chineseitem>
    5.    <item>Mathitem>
    6.    <item>Englishitem>
    7.    <item>Physicsitem>
    8.    <item>Chemistryitem>
    9. <item>Historyitem>
    10.    string-array>
    11. resources>

    Adapter代码分享

    1. package com.example.listmain;
    2. import android.content.Context;
    3. import android.view.LayoutInflater;
    4. import android.view.View;
    5. import android.view.ViewGroup;
    6. import android.widget.BaseExpandableListAdapter;
    7. import android.widget.ImageView;
    8. import android.widget.TextView;
    9. import java.util.ArrayList;
    10. public class MyBaseExpandableListAdapter extends BaseExpandableListAdapter {
    11. private ArrayList gData;
    12. private ArrayList> iData;
    13. private Context mContext;
    14. public MyBaseExpandableListAdapter(ArrayList gData, ArrayList> iData, Context mContext) {
    15. this.gData = gData;
    16. this.iData = iData;
    17. this.mContext = mContext;
    18. }
    19. @Override
    20. public int getGroupCount() {
    21. return gData.size();
    22. }
    23. @Override
    24. public int getChildrenCount(int groupPosition) {
    25. return iData.get(groupPosition).size();
    26. }
    27. @Override
    28. public Group getGroup(int groupPosition) {
    29. return gData.get(groupPosition);
    30. }
    31. @Override
    32. public Item getChild(int groupPosition, int childPosition) {
    33. return iData.get(groupPosition).get(childPosition);
    34. }
    35. @Override
    36. public long getGroupId(int groupPosition) {
    37. return groupPosition;
    38. }
    39. @Override
    40. public long getChildId(int groupPosition, int childPosition) {
    41. return childPosition;
    42. }
    43. @Override
    44. public boolean hasStableIds() {
    45. return true;
    46. }
    47. //取得用于显示给定分组的视图. 这个方法仅返回分组的视图对象
    48. @Override
    49. public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    50. ViewHolderGroup groupHolder;
    51. if(convertView == null){
    52. convertView = LayoutInflater.from(mContext).inflate(
    53. R.layout.item_exlist_group, parent, false);
    54. groupHolder = new ViewHolderGroup();
    55. groupHolder.tv_group_name = (TextView) convertView.findViewById(R.id.tv_group_name);
    56. convertView.setTag(groupHolder);
    57. }else{
    58. groupHolder = (ViewHolderGroup) convertView.getTag();
    59. }
    60. groupHolder.tv_group_name.setText(gData.get(groupPosition).getgName());
    61. return convertView;
    62. }
    63. //取得显示给定分组给定子位置的数据用的视图
    64. @Override
    65. public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    66. ViewHolderItem itemHolder;
    67. if(convertView == null){
    68. convertView = LayoutInflater.from(mContext).inflate(
    69. R.layout.item_exlist_item, parent, false);
    70. itemHolder = new ViewHolderItem();
    71. itemHolder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
    72. itemHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
    73. convertView.setTag(itemHolder);
    74. }else{
    75. itemHolder = (ViewHolderItem) convertView.getTag();
    76. }
    77. itemHolder.img_icon.setImageResource(iData.get(groupPosition).get(childPosition).getiId());
    78. itemHolder.tv_name.setText(iData.get(groupPosition).get(childPosition).getiName());
    79. return convertView;
    80. }
    81. //设置子列表是否可选中
    82. @Override
    83. public boolean isChildSelectable(int groupPosition, int childPosition) {
    84. return true;
    85. }
    86. private static class ViewHolderGroup{
    87. private TextView tv_group_name;
    88. }
    89. private static class ViewHolderItem{
    90. private ImageView img_icon;
    91. private TextView tv_name;
    92. }
    93. }

    还有两个类:Item 和 Group

    1. public class Item {
    2. private int iId;
    3. private String iName;
    4. public Item() {
    5. }
    6. public Item(int iId, String iName) {
    7. this.iId = iId;
    8. this.iName = iName;
    9. }
    10. public int getiId() {
    11. return iId;
    12. }
    13. public String getiName() {
    14. return iName;
    15. }
    16. public void setiId(int iId) {
    17. this.iId = iId;
    18. }
    19. public void setiName(String iName) {
    20. this.iName = iName;
    21. }
    22. }
    1. public class Group {
    2. private String gName;
    3. public Group() {
    4. }
    5. public Group(String gName) {
    6. this.gName = gName;
    7. }
    8. public String getgName() {
    9. return gName;
    10. }
    11. public void setgName(String gName) {
    12. this.gName = gName;
    13. }
    14. }

    补充一下,网上说实现ExpandableAdapter有三种方式:

    1. 扩展BaseExpandableListAdpter实现ExpandableAdapter。

    2. 使用SimpleExpandableListAdpater将两个List集合包装成ExpandableAdapter

    3. 使用simpleCursorTreeAdapter将Cursor中的数据包装成SimpleCuroTreeAdapter 

    鉴于我写的Demo比较简单,所以就先用了第一种。后面有时间我也会另外研究一下~

    最后,本次练手的代码可以左转到我的主页查看下载资源,欢迎一起交流学习吖~

    参考资料:

    ExpandableListView使用方法详解_会飞的鱼儿android的博客-CSDN博客_expandablelistview

    2.5.5 ExpandableListView(可折叠列表)的基本使用 | 菜鸟教程

  • 相关阅读:
    python3.9运行出现编码问题,在其他电脑上可以正常运行
    【MySQL】使用C/C++访问MySQL
    【HarmonyOS】【JAVA UI】自定义通知的实现
    极简7照训练法,奇趣相机引领儿童AI摄影潮流
    C51 - 定时器
    DP27 跳跃游戏(二)
    CSS中clip-path、white-space使用
    【开源】SpringBoot框架开发音乐平台
    高手过招不用鼠标,一款超好用的跨平台命令行界面库
    JavaScript-箭头函数
  • 原文地址:https://blog.csdn.net/sinat_28782331/article/details/124964920