ExpandableListView实现点击打开收起功能
2015-09-01 16:17
417 查看
Listview点击展开,显示详情。使用ExpandableListView可以轻松实现。网上有好多例子。但是出现了一个问题,当有多条数据,listview只显示一条。是因为listview的高设置的为watch_content, 这时就要添加一个ListViewUtils类,
package com.example.utils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
import android.widget.ListAdapter;
import android.widget.ListView;
public class ListViewUtils {
/** 动态改变listView的高度 ,计算ExpandableListView的group项的高度 */
public static void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
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);
// 计算子项View的宽高,注意listview所在的要是linearlayout布局
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
/*
* listView.getDividerHeight()获取子项间分隔符占用的高度,有多少项就乘以多少个减一
* params.height最后得到整个ListView完整显示需要的高度最后将params.height设置为listview的高度
*/
params.height = totalHeight + (listView.getDividerHeight() *(listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
/**
* 可扩展listview展开时调用
*
* @param listView
* @param groupPosition
*/
public static void setExpandedListViewHeightBasedOnChildren(
ExpandableListView listView, int groupPosition) {
ExpandableListAdapter listAdapter = (ExpandableListAdapter)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();
params.height += appendHeight;
listView.setLayoutParams(params);
}
/**
* 可扩展listview收起时调用
*
* @param listView
* @param groupPosition
*/
public static void setCollapseListViewHeightBasedOnChildren(
ExpandableListView listView, int groupPosition) {
ExpandableListAdapter listAdapter = (ExpandableListAdapter)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();
params.height -= appendHeight;
listView.setLayoutParams(params);
}
}
然后在Activity中调用:
ExpandableListAdapter adapter = new ExpandableListAdapter(this,
purchaseOrder.getDetails());
listView.setAdapter(adapter);
listUtils.setListViewHeightBasedOnChildren(listView);
/**
* 当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下的子项的高度
*/
listUtils.setExpandedListViewHeightBasedOnChildren(listView,
groupPosition);
// 更新group每一项的高度
listUtils.setListViewHeightBasedOnChildren(
listView);
}
});
/**
* 当ExpandableListview收缩时调用
*/
listView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
Log.e("collapse","收缩");
/*
* 计算group下的每一个子项的高度,然后收缩
*/
listUtils.setCollapseListViewHeightBasedOnChildren(listView,
groupPosition);
/*
* 重新评估group的高度
*/
listUtils.setListViewHeightBasedOnChildren(
listView);
/*
*ListUtil.setCollapseListViewHeightBasedOnChildren(listView, groupPosition);
*/
}
});
一个点击展开,再次点击收起的listview就成功了。
package com.example.utils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ExpandableListView;
import android.widget.ListAdapter;
import android.widget.ListView;
public class ListViewUtils {
/** 动态改变listView的高度 ,计算ExpandableListView的group项的高度 */
public static void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
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);
// 计算子项View的宽高,注意listview所在的要是linearlayout布局
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
/*
* listView.getDividerHeight()获取子项间分隔符占用的高度,有多少项就乘以多少个减一
* params.height最后得到整个ListView完整显示需要的高度最后将params.height设置为listview的高度
*/
params.height = totalHeight + (listView.getDividerHeight() *(listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
/**
* 可扩展listview展开时调用
*
* @param listView
* @param groupPosition
*/
public static void setExpandedListViewHeightBasedOnChildren(
ExpandableListView listView, int groupPosition) {
ExpandableListAdapter listAdapter = (ExpandableListAdapter)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();
params.height += appendHeight;
listView.setLayoutParams(params);
}
/**
* 可扩展listview收起时调用
*
* @param listView
* @param groupPosition
*/
public static void setCollapseListViewHeightBasedOnChildren(
ExpandableListView listView, int groupPosition) {
ExpandableListAdapter listAdapter = (ExpandableListAdapter)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();
params.height -= appendHeight;
listView.setLayoutParams(params);
}
}
然后在Activity中调用:
ExpandableListAdapter adapter = new ExpandableListAdapter(this,
purchaseOrder.getDetails());
listView.setAdapter(adapter);
listUtils.setListViewHeightBasedOnChildren(listView);
/**
* 当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下的子项的高度
*/
listUtils.setExpandedListViewHeightBasedOnChildren(listView,
groupPosition);
// 更新group每一项的高度
listUtils.setListViewHeightBasedOnChildren(
listView);
}
});
/**
* 当ExpandableListview收缩时调用
*/
listView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
Log.e("collapse","收缩");
/*
* 计算group下的每一个子项的高度,然后收缩
*/
listUtils.setCollapseListViewHeightBasedOnChildren(listView,
groupPosition);
/*
* 重新评估group的高度
*/
listUtils.setListViewHeightBasedOnChildren(
listView);
/*
*ListUtil.setCollapseListViewHeightBasedOnChildren(listView, groupPosition);
*/
}
});
一个点击展开,再次点击收起的listview就成功了。
相关文章推荐
- 多表查询存储过程
- C#------火星文翻译器
- 去掉WinLicense文件效验的方法
- 如何做一个合格的项目经理
- eclipse快捷键大全
- SELECT INTO , INSERT INTO SELECT 和 CREATE TABLE AS SELECT 的区别
- Eclipse-统计代码行数
- 转帖-shell脚本$与if用法
- 第一步Windows安装JAVA
- 快速排序
- SpringMvc+Spring+Mybatis+Maven整合
- 深圳办理港澳通行证及续签
- 使用 Node.js 开发基于 JavaScript 的 RESTful 应用
- POJ3255--次短路
- [译]我们是如何设计存储4亿个电话号码的
- oracle同时执行saveOrUpdate的操作
- table_cache – MySQL性能调优
- table_cache – MySQL性能调优
- table_cache – MySQL性能调优
- 我的项目管理观点