您的位置:首页 > 其它

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就成功了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: