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就成功了。