ExpandableListview嵌套griedview

Android ExpandableListView 中完美嵌套 GridView 在做项目的时候,想在 ExpandableListView 中嵌套一个 GridView,在实现的过程中,遇到了不少坑,所以写篇博客记录一下,也顺便帮助下和我一样的新手。我一直觉得,再多的文字,再多的代码片段,都不如写个小 Demo 更直观,所以在以后的博客中,我都尽量用小 Demo 来讲解,也给出源码。 阅读详情

最近在做这么一个功能,如图,

不知道我画 的清楚不清楚,整体的是一个大的列表,黄色部分就是列表每个项的名称,剩下的都是他的子项,刚开始我整体用expandlistview,然后子集里面的嵌套了一个griedview与一个listview,是不是很傻,虽然可以正常显示,但是点击后,滑动,再绑定listview的时候就错位了,但是我也重写每个listview和griedview 的onMeasure方法了呀,也还是到处有问题,我想可能是因为滑动,复位的原因,导致了错位,网上也不建议这种嵌套太多的代码,再想想,说白了,这个功能只有两点,1.整体的一个显示,2.点击后的显示,关键是点击后容易出问题,经过在群里询问,问大神们,一大神教了我一个办法就是把listview和griedview这两个不要拆开,看成一个item,在expandlistview绑定的时候根据不同的类型返回不同的布局,点击的时候将点击后的索引值存储起来(我这里用的是hashmap)下面把这个功能最重要的部分分享给大家,重点就在expandablelistAdapter里面

public class HemeExpandableListAdapter extends BaseExpandableListAdapter {
	@SuppressWarnings("unused")
	private Context context;
	private int TYPE_GRIEDVIEW = 0, TYPE_LISTITEM = 1;
	List<IndexRecommendTypes> groups;
	private final LayoutInflater listContainer;// 视图容器
	private ListItemView listItemView = null;// 父节点
	private ChildListItemView childItemView = null;// 子节点
	private  HashMap map = new HashMap();  //存储每个组的选中项
      
	public HemeExpandableListAdapter(Context context,
			List<IndexRecommendTypes> groups) {
		this.groups = groups;
		this.context = context;
		this.listContainer = LayoutInflater.from(context); // 创建视图容器并设置上下文
	}

	@Override
	public int getGroupCount() {
		// TODO Auto-generated method stub
		return groups == null ? 0 : groups.size();
	}

	@Override
	public int getChildrenCount(int groupPosition) {
		// TODO Auto-generated method stub
		//判断缓存组是否为空
	   if(map!=null && map.size()>0){
		   //判断是否包含该组项,若包含,那么获取该组的子集数量,否则获取默认第一个的子集数量
		   if(map.containsKey(groupPosition))
		   {
			   return groups.get(groupPosition).getChildProductTypeList().get(Integer.parseInt(map.get(groupPosition).toString()))
						.getAppProductDTOs().size() + 1;
		   }
	   }
			return groups.get(groupPosition).getChildProductTypeList().get(0)
					.getAppProductDTOs().size() + 1;
	}

	// 获取一级节点
	@Override
	public Object getGroup(int groupPosition) {
		// TODO Auto-generated method stub
		return groups.get(groupPosition);
	}

	// 获取所有子集
	@Override
	public Object getChild(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return groups.get(groupPosition).getChildProductTypeList()
				.get(childPosition + 1);// groups.get(groupPosition).getAppProductDTOs().get(childPosition);//
										// 获取子列表
	}

	// 父id
	@Override
	public long getGroupId(int groupPosition) {
		// TODO Auto-generated method stub
		return groupPosition;
	}

	// 子id
	@Override
	public long getChildId(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return childPosition;
	}

	// 如果为TRUE,意味着相同的ID永远引用相同的对象
	@Override
	public boolean hasStableIds() {
		// TODO Auto-generated method stub
		return false;
	}

	class ListItemView { // 自定义控件集合
		public TextView groupname;
	}

	class ChildListItemView {

		public MyDrawLineGridView grid_chid_sort;
		// 子集列表复用
		public TextView childname;
		public ImageView courseimg;
		public TextView peoplenum;
		public TextView teachername;
		public TextView teacherLabel;

	}
apdater最主要的两个部分,一个是获取组的数据,二是获取自己的数据

1.获取组数据,组只有1个textview,比较简单

// 绑定一级列表
	@Override
	public View getGroupView(int groupPosition, boolean isExpanded,
			View convertView, ViewGroup parent) {
		if (convertView == null) {
			// 获取list_item布局文件的视图
			convertView = listContainer.inflate(
					R.layout.lv_expand_group_layout, null);
			listItemView = new ListItemView();
			// 获取控件对象
			listItemView.groupname = (TextView) convertView
					.findViewById(R.id.txt_group_name);// 名称
			// 设置控件集到convertView
			convertView.setTag(listItemView);
		} else {
			listItemView = (ListItemView) convertView.getTag();
		}
		IndexRecommendTypes group = groups.get(groupPosition);
		listItemView.groupname.setText(group.getProductTypeName());// 设置组名
		return convertView;
	}
2.获取子集数据,这时子集分类有两部分,一部分为greidview的数据,另一部分为expandlistview的子集item项,我们返回连个不同的类型用来区分greidview和item,将griedview搁置到第一个位置

@Override
	public View getChildView(int groupPosition, int childPosition,
			boolean isLastChild, View convertView, ViewGroup parent) {
		// 根据不同的类型,来选择不同的布局文件,将griedview增加到item上
		int childType = getChildType(groupPosition, childPosition);
		ChildListItemView childItemView = null;
		if (convertView == null) {
			childItemView = new ChildListItemView();
			// 判断为哪个item
			if (childType == TYPE_GRIEDVIEW)// greidview形式
			{
				convertView = listContainer.inflate(R.layout.expand_child_item,
						null);
				childItemView.grid_chid_sort = (MyDrawLineGridView) convertView
						.findViewById(R.id.grid_child_sort);
			} else// 列表的item
			{
				convertView = listContainer.inflate(
						R.layout.lv_expand_child_layout, null);
				childItemView = new ChildListItemView();
				childItemView.childname = (TextView) convertView
						.findViewById(R.id.txt_first);
				childItemView.courseimg = (ImageView) convertView
						.findViewById(R.id.img_big);// 头像
				childItemView.peoplenum = (TextView) convertView
						.findViewById(R.id.txt_peaple_num);
				childItemView.teachername = (TextView) convertView
						.findViewById(R.id.txt_teacher_name);
				childItemView.teacherLabel = (TextView) convertView
						.findViewById(R.id.txt_money);
			}
			convertView.setTag(childItemView);

		} else {
			// 获取tag
			childItemView = (ChildListItemView) convertView.getTag();
		}
		// 赋值
		if (childType == TYPE_GRIEDVIEW)// griedview
		{
			// 绑定greidview
			final List<ChildProductTypeList> childdata = groups.get(
					groupPosition).getChildProductTypeList();
//这里是用来判断选中的是第几个griedview的项,用来变换颜色背景,就不贴griedview的adapter列表了
			int sIndex=0;
			if(map!=null && map.size()>0)
			{
				if(map.containsKey(groupPosition))
				{
					sIndex=Integer.parseInt(map.get(groupPosition).toString());
				}
			}
//griedview的绑定数据列表
			HomeChildSortAdapter adapter = new HomeChildSortAdapter(context,
					childdata,sIndex);
			childItemView.grid_chid_sort.setAdapter(adapter);
//大分类
			final int gposition=groupPosition;
			// griedview点击事件,点击变下面的列表数据
			childItemView.grid_chid_sort
					.setOnItemClickListener(new OnItemClickListener() {

						@SuppressWarnings("unchecked")
						@Override
						public void onItemClick(AdapterView<?> parent,
								View view, int position, long id) {
							// TODO Auto-generated method stub
						//保存点击的是第几组第几个griedview的项
							map.put(gposition, position);
							notifyDataSetChanged();

						}
					});
		} else// 列表
		{
			// 获取每个组的实体类
			
			final IndexRecommendTypes itemdata = groups.get(groupPosition);
			final AppProductDTOs childdata;// 子分类下的列表数据
		//判断缓存是否为空,并判断是否点击了该组。若已经点击,显示该组下的列表,否则显示默认第一组下的子集数据
			 if(map!=null && map.size()>0){
				   if(map.containsKey(groupPosition))
				   {
					   childdata = groups.get(groupPosition).getChildProductTypeList()
								.get(Integer.parseInt(map.get(groupPosition).toString())).getAppProductDTOs()
								.get(childPosition - 1);
				   }
				   else
				   {
						childdata = groups.get(groupPosition).getChildProductTypeList()
								.get(0).getAppProductDTOs().get(childPosition - 1);
				   }
			 }
			 else
			 {
					childdata = groups.get(groupPosition).getChildProductTypeList()
							.get(0).getAppProductDTOs().get(childPosition - 1);
			 }
			childItemView.childname.setText(childdata.getProductName());

			childItemView.peoplenum.setText("" + childdata.getClickCount());
			String teacherName = childdata.getTeachers();
			childItemView.teacherLabel.setVisibility(View.VISIBLE);
			if (!TextUtils.isEmpty(teacherName)) {
				childItemView.teachername.setText(teacherName);
			} else {
				childItemView.teacherLabel.setVisibility(View.INVISIBLE);
				childItemView.teachername.setText("");
			}
//这里图片显示我用的是imageloader
			ImageLoader.getInstance().displayImage(childdata.getProductImg(), childItemView.courseimg ,BitmapUtil.getPersonLoading());
			convertView.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					//子项的点击事件,可以跳转可以做任何事。
				}
			});
		}
		return convertView;
	}

	@Override
	public boolean isChildSelectable(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return false;
	}
//重点,一定要返回2个类型的布局,一个是griedview的布局,另一个是linerout的布局(相当于listview的item)
	@Override
	public int getChildTypeCount() {
		// TODO Auto-generated method stub
		return 2;
	}

	// 返回不同type类型的布局
	@Override
	public int getChildType(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		if (childPosition == 0) {
			return TYPE_GRIEDVIEW;// 带有griedview的
		} else {
			return TYPE_LISTITEM;// listview列表的item项
		}
	}
expandablelistadapter就完成了,代码有点乱,但是思想就是这样实现的,我在网上找到很多就是expandlistview嵌套greidview的,但是他们下面都没有列表了,而我这种功能下面还有很多列表,好了,第一次自己把自己写的代码贴出来,写的不好,见笑,如有问题之处还忘大家积极指正出来,我会积极改正,也希望有遇到这种功能的时候,能够帮助到大家,这是我最终的目的,谢谢大家!






Android ExpandableListView折叠菜单的三层嵌套实现 小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!资料⬅专栏获取无助**。 阅读详情

相关推荐

Android ExpandableListView折叠菜单的三层嵌套实现(1)

有了思路,关于 ExpandableListView 的三层嵌套就直接上手实现这里说下我的需求是有些数据是只有二级,有些数据是三级的。如果你的需求是只有三级,不需要考虑三级二级混合的情况,下面有说明怎么处理。效果图。

2401_84132393的博客 1078

使用ExpandableListView实现ListView嵌套ListView

今天写界面发现是个ListView的嵌套 对我这个新手而言,只能发动网友的力量在网上找demo了,奈何没有找到。。。。(可能我搜索关键词不准确)还浪费了我的积分!后来突然想起之前有用ExpandableListView写过分组列表,让它默认展开并且不能收缩不就实现了我想要的效果了吗?哈哈哈,机智如我:) 关键代码: @ViewInject(value = R.id.elv_conf

Heatherhh的博客 1785

工具篇——ExpandableListViewForScrollView(解决ScrollView嵌套ExpandableListView,ExpandableListView显示不全的问题)

写代码的四点: 1.明确需求。要做什么? 2.分析思路。要怎么做?(1,2,3……) 3.确定步骤。每一个思路要用到哪些语句、方法和对象。 4.代码实现。用具体的语言代码将思路实现出来。学习新技术的四点: 1.该技术是什么? 2.该技术有什么特点?(使用需注意的方面) 3.该技术怎么使用?(写Demo) 4.该技术什么时候用?(在Pr...

一个灵活的胖子MrWang 2238

ExpandableListView(listView嵌套)

可以做出一个类似QQ分组的界面(点开分组,里面有人) 在mainactivity中连接到界面,findById找到ExpandableListView,初始化数据,这个初始化是两个List的嵌套,把Student数据放到List students中,把Clazz数据放在List mClazz中,然后把students套进mClazz中(每个班级都有好多学生,每个mClazz中都有一个studen

A little progress a day 900

android ExpandableListView简单应用及listview模拟ExpandableListView

首先我们还是来看一些案例,还是拿搜狐新闻客户端,因为我天天上下班没事爱看这个东东,上班又没时间看新闻,上下班路途之余浏览下新闻打发时间嘛.                            看这个效果挺棒吧,其实实现起来也不难,我简单说明下. 首先我们用到的控件是:ExpandableListView 布局文件: <RelativeLayout xmlns:android="ht

jj120522的专栏 9950

ScrollView 嵌套ListView、ExpandableListView等列表

很多时候在需求上不仅仅是ListView等列表单独滑动,而是在ListView等列表上加上其他的试图,整个试图整体一起滑动,这个时候就会用到ScrollView嵌套ListView等列表试图一起使用。 如下图所示: 但ScrollView嵌套Listview等列表试图比我们预想的实现起来要困难。会有以下的一些问题 1、ScrollView 和 ListView 滑动冲突 2、 Listv...

技术上的那点事 1948

29. 【Android教程】折叠列表 ExpandableListView

本节学习一个可折叠的 ListView,可以用在一些需要分类的场景下。通过 ExpandableListView 我们可以首先在 ListView 上展示大的分类,当点击某个类别的时候再将 ListView 做一个展开,展示该类下的所有子类供用户选择。它与 ListView 的不同主要是 ExpandableListView 提供了两级列表,可以方便的做伸展和收缩。

这是一个web全栈开发的博客,取其精华去其糟粕,争取让大家一看就懂,一学就会,一用就成~ 3129

RV1126 ISP开发实战:从Tuner调试到IQ文件解析

本文详细介绍了RV1126 ISP开发的完整流程,从Tuner调试到IQ文件解析,涵盖了环境搭建、工具使用、参数配置及性能优化等关键环节。通过实战案例和避坑指南,帮助开发者快速掌握Rockchip芯片的ISP开发技巧,提升图像处理质量。

weixin_29195615的博客 571

【Android UI设计】ExpandableListView详解

一、前言今天我们来实现一下如下这个效果,类似于QQ好友分组的UI效果,废话不多说,先上效果图: ExpandableListView是一个用来显示二级节点的listview。默认展示的是第一级的分组,点击某个分组后会展开该分组下的子列表。

风吹起如花般细碎流年 2万+

基于ROS与Gazebo的多机器人三角形编队仿真实践

本文详细介绍了基于ROS与Gazebo的多机器人三角形编队仿真实践,从环境搭建到编队控制的全过程。通过TurtleBot3机器人模型和TF坐标系系统,实现三个机器人的三角形编队控制,适用于机器人协同作业与编队算法研究。

weixin_29313817的博客 187

在win10系统上安装opnet14.5注意事项和步聚

opnet 14.5安装避坑!

miracle_eicont的专栏 1037

ExpandableListView的使用,可展开的ListView

先看下效果 ExpandableListView 和LiseView类似,继承自extends ListView,布局:<ExpandableListView android:id="@+id/elv" android:layout_width="match_parent" android:layout_height="match_parent"/

jiangtea的博客 411

生成式引擎优化(GEO)全景指南:技术架构、实施策略与未来趋势

生成式引擎优化(GEO)全景指南摘要 GEO(生成式引擎优化)是针对AI生成内容(如ChatGPT、文心一言等)的优化策略,通过结构化数据、权威建设与语义优化提升企业内容在AI答案中的引用优先级,实现“无点击曝光”。其核心价值在于从流量竞争转向信任构建,突破传统SEO局限。技术架构依托RAG(检索增强生成)、向量数据库及反馈学习机制,动态优化内容生成与引用逻辑。实施策略包括:部署结构化数据(如JSON-LD)、维护动态知识图谱、适配多模态内容(3D/VR)、联合权威机构发布白皮书。行业案例显示,美妆、智能家

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 1451

Android ExpandableListView嵌套ListView

ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同的是,它可以有两层:每一层都能够被独立的展开并显示其子项。这些子项来自于与该视图关联的BaseExpandableListAdapter。      有时候简单的ExpandableListView不能满足我们的需求,比如下面这样的需求:      这就需要在ExpandableListView里面

liuhanhan512的专栏 4019

Transformer代码(Pytorch实现和详解)!!!

这个是第一版,有些代码如果不对,欢迎在评论指正,后续会慢慢改,我也是刚接触transformer,若有些地方理解不对还请指正。

xml的博客 5612

AUTO-DL平台快速部署BEVFormer:Nuscenes数据集完整训练避坑指南

本文详细介绍了在AUTO-DL平台高效部署BEVFormer模型并利用Nuscenes数据集进行完整训练的实战指南。重点解析了平台数据管理、环境配置、数据集迁移解压、预处理及训练启动等全流程中的关键步骤与常见避坑技巧,帮助研究者和工程师快速复现这一前沿视觉感知模型,节省云端训练时间与成本。

weixin_29188043的博客 330

ScrollView中嵌套ExpandableListView

为了让SrollView中嵌套ExpandableListView,我们就得改ListView的高度,所以写一个类继承于ExpandableListview: import android.content.Context; import android.util.AttributeSet; import android.widget.ExpandableListView; /*

土豆洋芋山药蛋的博客 1906

手把手教你学simulink(26.8)--控制算法场景示例:基于强化学习的无人机姿态稳定控制系统

首先,我们需要定义无人机的姿态稳定控制环境。环境包括无人机的状态(姿态角、角速度等)和动作(电机转速)。我们还需要定义奖励函数,用于评估控制器的表现。matlab深色版本% 定义环境% 定义状态空间% 12个状态变量% 定义动作空间% 电机转速范围奖励函数用于评估控制器的表现。我们可以根据无人机的姿态误差、角速度误差以及控制输入的变化率来设计奖励函数。具体来说,当无人机的姿态接近设定值时,给予正奖励;当姿态误差较大或控制输入变化剧烈时,给予负奖励。matlab深色版本。

MHD0815的博客 495

【Android基础】ExpandableListView嵌套ListView

ExpandableListView是一个垂直滚动显示两级列表项的视图,与ListView不同的是,它可以有两层:每一层都能够被独立的展开并显示其子项。这些子项来自于与该视图关联的BaseExpandableListAdapter。 有时候简单的ExpandableListView不能满足我们的需求,比如下面这样的需求: 这就需要在ExpandableListView里面再嵌套一个List

u013761606的专栏 771

YOLO11涨点优化:Loss魔改 | WIoU (Wise-IoU) v3版本全面替换,基于动态非单调聚焦机制,让模型更聪明地学习

YOLOv11目标检测中的WIoU v3损失函数改进 本文探讨了YOLOv11目标检测模型中CIoU损失函数的局限性,并提出了WIoU v3改进方案。关键发现包括: CIoU的缺陷:在低质量样本(小目标/遮挡目标)上过度惩罚,导致模型优化方向偏离,小目标AP往往比大目标低30%左右。 WIoU v3的创新: 动态非单调聚焦机制:根据样本"离群度"智能分配梯度 让模型重点优化中等质量样本,减少对低质量样本的无效关注 采用指数移动平均来自适应调整质量评判标准 实际效果:WIoU v3在保持大

2601_95807009的博客 422

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android 取消 ExpandableListView 的分割线,解决ScrollView 嵌套 ExpandableListView的问题

ExpandableListView 的布局中加入 android:childDivider="@android:color/transparent" 可取消 分割线 Scroll 嵌套 ExpandableListView 条目显示不完整,解决如下: /** * 重写ExpandableListView以解决ScrollView嵌套ExpandableListView * Created b...

345丶 446

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ScrollView 中嵌套ExpandableListView时的显示问题处理方法

:如果需要ExpandableListView的使用请移步:https://blog.youkuaiyun.com/qq_36355271/article/details/86472262 ScrollView 中嵌套ExpandableListView 一行代码解决显示问题 新建NestedExpandaleListView 继承ExpandableListView 在onMeasure中加入 int...

qq_36355271的博客 1037

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

expandableListView 自定义样式以及scrollerView嵌套

最近写项目需要用到ExpandableListView,由于第一次使用,被它各种虐。网上也查看很多资料,但都没有实质的对它做个总结。本人不才,把自己项目中遇到的问题小记一下,分享给初学者。(部分是网上copy的,敬请谅解)          ExpandableListView组件是android中一个比较常用的组件,当点击一个父item的时候可以将他的子item显示出来,像手机QQ中的好友列表

MySunshine的专栏 1289
上一篇: android 布局
下一篇: webview 重定向
Bj_junxia
博客等级 码龄16年 10粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值