之前有整理过ScrollView嵌套ListView的例子,讲的是计算listview的每一项的高度。已达到目标效果。同样的ExpandableListView嵌套ScrollView也是这么个思路,不过要稍微加一些方法和稍微做一些改动。

要实现这个功能首先要准备三个基础的方法:

一、计算ExpandableListView的group项的高度的方法(即计算listview合并时的高度的方法)备注:ExpandableListView是listview的子类所以,listview的方法它同样可以使用

/** 动态改变listView的高度 */
public void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
// params.height = 80 * (listAdapter.getCount() - 1);
// params.height = 80 * (listAdapter.getCount());
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
((MarginLayoutParams) params).setMargins(0, 0, 0, 0);
listView.setLayoutParams(params); }

二、计算ExpandableListView展开时group下的子view列表的高度的方法

/**
* 可扩展listview展开时调用
*
* @param listView
* @param groupPosition
*/
public static void setExpandedListViewHeightBasedOnChildren(
ExpandableListView listView, int groupPosition) {
ExpandableListAdapter listAdapter = listView.getExpandableListAdapter();
if (listAdapter == null) {
return;
}
View listItem = listAdapter.getChildView(groupPosition, 0, true, null,
listView);
listItem.measure(0, 0);
int appendHeight = 0;
for (int i = 0; i < listAdapter.getChildrenCount(groupPosition); i++) {
appendHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
// Log.d(TAG, "Expand params.height" + params.height);
params.height += appendHeight;
listView.setLayoutParams(params);
}

三、计算ExpandableListView合并时消除group下的子view列表的高度的方法

/**
* 可扩展listview收起时调用
*
* @param listView
* @param groupPosition
*/
public static void setCollapseListViewHeightBasedOnChildren(
ExpandableListView listView, int groupPosition) {
ExpandableListAdapter listAdapter = listView.getExpandableListAdapter();
if (listAdapter == null) {
return;
}
View listItem = listAdapter.getChildView(groupPosition, 0, true, null,
listView);
listItem.measure(0, 0);
int appendHeight = 0;
for (int i = 0; i < listAdapter.getChildrenCount(groupPosition); i++) {
appendHeight += listItem.getMeasuredHeight();
}
/*Log.d(TAG,
"Collapse childCount="
+ listAdapter.getChildrenCount(groupPosition));*/
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height -= appendHeight;
listView.setLayoutParams(params);
}

三个计算方法都贴出来了,下面来看看这三个方法到底是怎样使用的

一、在设置ExpandableListView的adapter的时候计算一下它合并时的宽度,并显示出来。(这一步是初始化)

例如:

listView.setAdapter(adapter);
ListUtil.getInstance().setListViewHeightBasedOnChildren(listView);

二、当ExpandableListView展开时调用计算方法

例如:

/**
* 当ExpandableListView展开时调用
*/
listView.setOnGroupExpandListener(new OnGroupExpandListener() { @Override
public void onGroupExpand(int groupPosition) {
/*
* Log.e("expand", "扩展"); for (int i = 0; i < 4; i++) { if
* ((groupPosition != i) && listView.isGroupExpanded(i)) {
* listView.collapseGroup(i); } }
*/
/**
* 计算group下的子项的高度
*/
ListUtil.setExpandedListViewHeightBasedOnChildren(listView,
groupPosition);
// 更新group每一项的高度
ListUtil.getInstance().setListViewHeightBasedOnChildren(
listView);
}
});

三、当ExpandableListView合并时调用计算方法

例如:

/**
* 当ExpandableListview收缩时调用
*/
listView.setOnGroupCollapseListener(new OnGroupCollapseListener() { @Override
public void onGroupCollapse(int groupPosition) {
Log.e("collapse", "收缩"); /*
* 计算group下的每一个子项的高度,然后收缩
*/
ListUtil.setCollapseListViewHeightBasedOnChildren(listView,
groupPosition);
/*
* 重新评估group的高度
*/
ListUtil.getInstance().setListViewHeightBasedOnChildren(
listView);
/*
* ListUtil.setCollapseListViewHeightBasedOnChildren(listView,
* groupPosition);
*/
}
});

好了,到这里就结束了。备注:在计算方发中的adapter中的layout外层布局不能是RelativeLayout,否则将会报空指针。具体什么原因我就不说了,晚上一大堆的。

Android ExpandableListView和ScrollView联用的一些注意事项的更多相关文章

  1. android 布局之scrollview

    今天在布局页面的时候后犯了难,我要显示的内容一个页面展示不完,怎么办呢? 于是随便找了个app点开一看,哎呀原来还能翻动啊!这是啥布局呢?原来是ScrollView 官方api相关的内容全是英文,这可 ...

  2. Android UI系列-----ScrollView和HorizontalScrollView

    本篇随笔将讲解一下Android当中比较常用的两个布局容器--ScrollView和HorizontalScrollView,从字面意义上来看也是非常的简单的,ScrollView就是一个可以滚动的V ...

  3. Android开发:ScrollView嵌套GridView的解决办法

    Android开发:ScrollView嵌套GridView的解决办法   前些日子在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便 ...

  4. 【开源项目4】Android ExpandableListView

    如果你对Android提供的Android ExpandableListView并不满意,一心想要实现诸如Spotify应用那般的效果,那么SlideExpandableListView绝对是你最好的 ...

  5. Android监听ScrollView滑动到顶端和底部

    Android监听ScrollView滑动到顶端和底部     package cn.testscrollview; import android.os.Bundle; import android. ...

  6. [Android] Android最简单ScrollView和ListView滚动冲突解决方案

    [Question]问题描述: 单独的ListView列表能自动垂直滚动,但当将ListView嵌套在ScrollView后,会和ScrollView的滚动滑块冲突,造成ListView滑块显示不完整 ...

  7. Android ViewFlipper增添ScrollView后不能滑动了

    Android ViewFlipper添加ScrollView后不能滑动了在Activity中添加ScrollView实现滚动activity的效果后,activity的滑动效果却无法生效了,原因是因 ...

  8. [转载]Android: 如何实现ScrollView中含有ListView?

    原文地址:Android: 如何实现ScrollView中含有ListView?作者:mailofzxf ListView本身就含有ScrollView,因此把ListView放到ScrollView ...

  9. Android ExpandableListView的使用详解

    ExpandableListView(可扩展的ListView) ExpandableListVivew是ListView的子类,它在普通ListView的基础上进行了扩展,它把应用中的列表项分为几组 ...

随机推荐

  1. Apache:详解QSA,PT,L,E参数的作用

    [QSA] 当被替换的URI包含有query string的时候,apache的默认行为是,丢弃原有的query string 并直接使用新产生的query string,如果加上了[QSA]选项,那 ...

  2. 【CSS学习】--- overflow属性

    一.前言 在网页布局中,未处理的溢出元素绝对算得上是个“毒瘤”.因为如果一个“盒子”周围还有其它元素,而从这个盒子中溢出的元素会和盒子周围的元素发生层叠,并脱离了整个HTML元素,所以我们应当合理使用 ...

  3. “一切都是消息”--iMSF(即时消息服务框架)入门简介

    “一切都是消息”--这是iMSF(即时消息服务框架)的设计哲学. MSF的名字是 Message Service Framework 的简称,由于目前框架主要功能在于处理即时(immediately) ...

  4. Java并发编程(三)Thread类的使用

    一.线程的状态 线程从创建到最终的消亡,要经历若干个状态.一般来说,线程包括以下这几个状态:创建(new).就绪(runnable).运行(running).阻塞(blocked).time wait ...

  5. (后台)java 读取excel 文件 Unable to recognize OLE stream 错误

    原因:不支出读取 excel 2007 文件(*.xlsx).只支持 excel 2003 (*.xls). 光修改文件后缀不行,需要文件另存(或者导出)为 .xls Excel 1997-2004 ...

  6. scrapy系列(一)——Python 爬虫框架 Scrapy1.2 Windows 安装教程

    scrapy作为一个成熟的爬虫框架,网上有大量的相关教程供大家选择,尤其是关于其的安装步骤更是丰富的很.在这里我想记录下自己的相关经验,希望能给大家带来点帮助. 在scrapy0.24版之前,安装sc ...

  7. 小技巧-mac修改finder菜单栏

    效果: 方法: 添加:打开finder后,长按command,可以将其他app拖到菜单栏. 删除:同理,长按command,将不需要的图标拖出菜单栏即可. PS:强烈推荐gotoshell这个小工具, ...

  8. HTML5文件API之FileReader

    在文件上传之前,我们总想预览一下文件内容,或图片样子,html5 中FileReader正好提供了2种方法,可以在不上传文件的情况下,预览文件内容. 图片预览:readAsDataURL(file); ...

  9. EntityFramework Code-First 简易教程(十)-------多对多

    配置Many-to-Many(多对多)关系: 这里有两个类,Student和Course,一个Student可以有多个Course,一个Course也可以有多个Student,所以这就成了多对多关系. ...

  10. Centos7.5.1804永久生效修改主机名

    原来主机名 [root@node1 ~]# 查看Centos的版本: [root@node1 ~]# cat /etc/redhat-release CentOS Linux release (Cor ...