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,否則將會報空指針。具體什么原因我就不說了,晚上一大堆的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM