ExpandableListView实现点击打开收起功能

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值