Android之view提升:四 使用ExpandableListView 折叠显示

  • 组项布局
  • 子项布局
  • 自定义Adapter 继承 BaseExpandableListAdapter
package cn.study.project.study_view_improve;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;/*** @author zyy* @date 2021年06月01日 上午10:41*/
public class ExpandableAdapter extends BaseExpandableListAdapter {private final String[] groups;private final String[][] childs;private final Context mContext;public ExpandableAdapter(String[] groups, String[][] childs, Context mContext) {this.groups = groups;this.childs = childs;this.mContext = mContext;}@Overridepublic int getGroupCount() {if(groups!=null)return groups.length;return 0;}@Overridepublic int getChildrenCount(int groupPosition) {return childs[groupPosition].length;}@Overridepublic Object getGroup(int groupPosition) {return groups[groupPosition];}@Overridepublic Object getChild(int groupPosition, int childPosition) {return childs[groupPosition][childPosition];}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}@Override//分组和子选项是否持有稳定的ID, 就是说底层数据的改变会不会影响到它们public boolean hasStableIds() {return true;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {GroupViewHolder holder;if(convertView == null){convertView = LayoutInflater.from(mContext).inflate(R.layout.parent_layout,parent,false);holder = new GroupViewHolder();holder.parent_tv = convertView.findViewById(R.id.parent_tv_id);holder.parent_image = convertView.findViewById(R.id.parent_image_id);convertView.setTag(holder);}else{holder = (GroupViewHolder) convertView.getTag();}holder.parent_tv.setText(groups[groupPosition]);if(isExpanded){holder.parent_image.setImageResource(R.drawable.ic_baseline_keyboard_arrow_down_24);}else{holder.parent_image.setImageResource(R.drawable.ic_baseline_keyboard_arrow_right_24);}return convertView;}@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {ChildViewHolder holder;if(convertView == null){convertView = LayoutInflater.from(mContext).inflate(R.layout.child_layout,parent,false);holder = new ChildViewHolder();holder.child_tv = convertView.findViewById(R.id.chidren_item);convertView.setTag(holder);}else{holder = (ChildViewHolder) convertView.getTag();}holder.child_tv.setText(childs[groupPosition][childPosition]);return convertView;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}static class GroupViewHolder{TextView parent_tv;ImageView parent_image;}static class ChildViewHolder{TextView child_tv;}
}
  • RelativeLayout 的使用
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"android:background="@color/black"android:layout_height="50dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:id="@+id/parent_tv_id"android:text="test"android:textColor="@color/white"android:gravity="center_vertical"android:paddingLeft="10dp"android:textSize = "18sp"/><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/parent_image_id"android:src="@drawable/ic_baseline_keyboard_arrow_right_24"android:layout_centerInParent="true"android:layout_alignParentEnd="true"/></RelativeLayout>
  • MainActivity.java 中实现监听等事件
package cn.study.project.study_view_improve;import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;public class MainActivity extends AppCompatActivity {private ExpandableListView expand_list_id;//Model:定义的数据private String[] groups = {"开发部", "人力资源部", "销售部"};//注意,字符数组不要写成{{"A1,A2,A3,A4"}, {"B1,B2,B3,B4,B5"}, {"C1,C2,C3,C4"}}private String[][] childs = {{"赵珊珊", "钱丹丹", "孙可可", "李冬冬"}, {"周大福", "吴端口", "郑非", "王疯狂"}, {"冯程程", "陈类", "楚哦", "魏王"}};@SuppressLint("ClickableViewAccessibility")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);expand_list_id = findViewById(R.id.expanded_list_view);ExpandableAdapter adapter=new ExpandableAdapter(groups,childs,MainActivity.this);expand_list_id.setAdapter(adapter);//默认展开第一个分组expand_list_id.expandGroup(0);//关闭数组某个数组,可以通过该属性来实现全部展开和只展开一个列表功能//expand_list_id.collapseGroup(0);
//        expand_list_id.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {//            @Override
//            public boolean onGroupClick(ExpandableListView expandableListView, View view, int groupPosition, long l) {//                showToastShort(groups[groupPosition]);
//                return false;
//            }
//        });
//        //子视图的点击事件
//        expand_list_id.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {//            @Override
//            public boolean onChildClick(ExpandableListView expandableListView, View view, int groupPosition, int childPosition, long l) {//                showToastShort(childs[groupPosition][childPosition]);
//                return true;
//            }
//        });
//        //用于当组项折叠时的通知。
//        expand_list_id.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {//            @Override
//            public void onGroupCollapse(int groupPosition) {//                showToastShort("折叠了数据___"+groups[groupPosition]);
//            }
//        });
//        //
//        //用于当组项展开时的通知。
//        expand_list_id.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {//            @Override
//            public void onGroupExpand(int groupPosition) {//                showToastShort("展开了数据___"+groups[groupPosition]);
//            }
//        });
//}}
  • 更多, 请参考博客

Android之View提升:四 使用ExpandableListView 折叠显示相关推荐

  1. android 绘制心率曲线图,Android 特效View第四弹之折线图 心率图

    Android 特效View第四弹之折线图 心率图 android:layout_width="match_parent" android:layout_height=" ...

  2. 精通Android自定义View(十四)绘制水平向右加载的进度条

    1引言 1 精通Android自定义View(一)View的绘制流程简述 2 精通Android自定义View(二)View绘制三部曲 3 精通Android自定义View(三)View绘制三部曲综合 ...

  3. Android 自定义View(四)实现股票自选列表滑动效果

    一.前言 Android 开发过程中自定义 View 真的是无处不在,随随便便一个 UI 效果,都会用到自定义 View.前面三篇文章已经讲过自定义 View 的一些案例效果,相关类和 API,还有事 ...

  4. android自定义View之(四)------一键清除动画

    1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解,做了一个一键清除的动画.当年,我实现这个是用了几张图片,采用F ...

  5. Android自定义View的四种方式

    目录 一 前言 二 分类 1.组合控件 2.继承系统控件 3.继承View 4.继承ViewGroup 三 自定义View 1.构造函数 2.onMeasure 3.onLayout 4.onDraw ...

  6. Android自定义View研究(四) -- 在XML中定义View

    如果在一直使用SetContentView(new HellwView(this)感觉总是少了一点东西,少了什么了,失去了Android中使用XML定义组件的方便性性,这种感觉让人很不爽,呵呵,在这节 ...

  7. Android自定义View实现图片放大,平移和显示大图片

    原文地址 图片如果不显示:点击这里 前言 首先分析一下需求:将一个图片显示在屏幕上,并能够对其放大或者平移. 用 canvas 画 bitmap 主要有这么几个方法. void drawBitmap( ...

  8. android自定义起止时间的时间刻度尺,Android 自定义View篇(六)实现时钟表盘效果...

    前言 Android 自定义 View 是高级进阶不可或缺的内容,日常工作中,经常会遇到产品.UI 设计出花里胡哨的界面.当系统自带的控件不能满足开发需求时,就只能自己动手撸一个效果. 本文就带自定义 ...

  9. android+清除循环动画,android自定义View之(4)-一键清除动画

    android自定义View之(四)------一键清除动画 1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解, ...

最新文章

  1. Sqli-labs less 50
  2. UVA662- Fast Food
  3. MBR与GPT分区格式(实例-创建大于2TB的分区)
  4. Windows 环境下载安装Docker
  5. 使用 Boost.Multiprecision 来实现高精度高斯-拉盖尔正交积分
  6. 【MapReduce】
  7. Linux中,文件创建的时间是怎么保存的?
  8. mac vscode设置中文_VSCode编写latex
  9. 为什么日本人晚上那么晚去居酒屋吃炸鸡喝啤酒,但街上却鲜有胖子?
  10. Spring事务管理的四种方式(以银行转账为例)
  11. Java后台开发一:环境搭建
  12. MySQL实战第二十二讲-MySQL有哪些“饮鸩止渴”提高性能的方法?
  13. 关于百度地图定位出现5e-324的解决办法
  14. GVM踩坑记录之 Failed to find port_list ‘33d0cd82-57c6-11e1-8ed1-406186ea4fc5‘
  15. 【C++】辗转相除求最大公约数算法及原理
  16. D-MNSV6-X8|D-MNSV7-X16磁导航传感器RS232/RS485(MODBUS-RTU)通讯协议说明
  17. Android换肤技术
  18. MySQL实现字符串连接
  19. 删除数组中重复的元素 C语言
  20. 活动邀请 | 虹科邀您参加“开启TSN之路”技术研讨会

热门文章

  1. PIPIOJ 1056: PIPI的目标Ⅱ
  2. ECharts之类型3D(map,bar3D,scatter3D)
  3. 大牛deep learning入门教程
  4. 我对INFOR WMS实施的一些感想
  5. Android Alarm定时任务基础
  6. AGV移动机器人无人叉车控制器设计
  7. 华为鸿蒙手机充电期间系统将进行深度优化
  8. 阿里JAVA实习生面试总结(2019年春招)
  9. 林业调查规划设计资质申办流程及要求?
  10. 《两化融合 数字化转型 价值效益参考模型》国家标准全文