随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

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,否则将会报空指针。具体什么原因我就不说了,晚上一大堆的。

posted on   飘杨......  阅读(4694)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示