Android ExpandableListView和ScrollView联用的一些注意事项
之前有整理过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联用的一些注意事项的更多相关文章
- android 布局之scrollview
今天在布局页面的时候后犯了难,我要显示的内容一个页面展示不完,怎么办呢? 于是随便找了个app点开一看,哎呀原来还能翻动啊!这是啥布局呢?原来是ScrollView 官方api相关的内容全是英文,这可 ...
- Android UI系列-----ScrollView和HorizontalScrollView
本篇随笔将讲解一下Android当中比较常用的两个布局容器--ScrollView和HorizontalScrollView,从字面意义上来看也是非常的简单的,ScrollView就是一个可以滚动的V ...
- Android开发:ScrollView嵌套GridView的解决办法
Android开发:ScrollView嵌套GridView的解决办法 前些日子在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便 ...
- 【开源项目4】Android ExpandableListView
如果你对Android提供的Android ExpandableListView并不满意,一心想要实现诸如Spotify应用那般的效果,那么SlideExpandableListView绝对是你最好的 ...
- Android监听ScrollView滑动到顶端和底部
Android监听ScrollView滑动到顶端和底部 package cn.testscrollview; import android.os.Bundle; import android. ...
- [Android] Android最简单ScrollView和ListView滚动冲突解决方案
[Question]问题描述: 单独的ListView列表能自动垂直滚动,但当将ListView嵌套在ScrollView后,会和ScrollView的滚动滑块冲突,造成ListView滑块显示不完整 ...
- Android ViewFlipper增添ScrollView后不能滑动了
Android ViewFlipper添加ScrollView后不能滑动了在Activity中添加ScrollView实现滚动activity的效果后,activity的滑动效果却无法生效了,原因是因 ...
- [转载]Android: 如何实现ScrollView中含有ListView?
原文地址:Android: 如何实现ScrollView中含有ListView?作者:mailofzxf ListView本身就含有ScrollView,因此把ListView放到ScrollView ...
- Android ExpandableListView的使用详解
ExpandableListView(可扩展的ListView) ExpandableListVivew是ListView的子类,它在普通ListView的基础上进行了扩展,它把应用中的列表项分为几组 ...
随机推荐
- Windows 10 将MySQL5.5升级为MySQL5.7
最近想学习一下java.找到一个开源项目需要mysql5.7.11+ 升级 电脑上装的是MySQL 5.5,准备直接升级到最新版本的5.7,对于MySQL好像并没有直接升级到最新版本的功能,下载了Wi ...
- js 中导出excel 较长数字串会变成科学计数法
在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串转换成 科学计数法.现在网上找到解决方案之一: (在数字串 ...
- OneMap Client API
MapSystem.Map.SmMap类 方法 mergerGeo:function(geoList) 将多个几何图形合并(支持面.线),组合成一个复合对象 例子: var geo=this.myMa ...
- react+antd分页 实现分页及页面刷新时回到刷新前的page
antd框架地址:https://ant.design/index-cn 利用antdUI框架做了个分页,其他功能都没问题,但是页面跳转后刷新会回到第一页,经过学习,在组件里增加了hash值,详情请看 ...
- CSS&JS两种方式实现手风琴式折叠菜单
<div class="accordion"> <div id="one" class="section"> < ...
- python练习(-)
简单的爬虫示例: import urllib.request #python2.x版本为urllib2url = 'http://www.douban.com/'webPage=urllib.requ ...
- MySQL InnoDB表和索引之聚簇索引与第二索引
MySQL InnoDB表和索引之聚簇索引与第二索引 By:授客QQ:1033553122 每个InnoDB表都有一个称之为聚簇索引(clustered index)的特殊索引,存储记录行数据.通常, ...
- Java集合之TreeMap源码分析
一.概述 TreeMap是基于红黑树实现的.由于TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射根据其键的自然顺序进行排序或者根据创建映射时提供的C ...
- (网页)alert()怎么回事出不来,代码没有写错
1.不报错,请查看浏览器是否禁掉了alter. 2.console.log()输出,避免这种尴尬.
- (后端)Java跨域过滤器
private FilterConfig config = null; @Override public void init(FilterConfig config) throws ServletEx ...