1. 程式人生 > >scrollView和listView的滑動衝突和listView顯示不全

scrollView和listView的滑動衝突和listView顯示不全

        溫馨提示:基本現在使用listView的已經很少了,比較推薦使用RecyclerView

        在開發過成功,我們經常要用到listView和ScrollView巢狀的佈局,但是當外層為ScrollView時有時候就會出現listView命名有N行item但是卻只顯示了一條item項,這是因為我們要兩個控制元件的焦點獲取問題,你可能會發現當你想滑動ScrollView的時候ListView會優先滑動,那麼這時候我們需要設定listView禁止滑動並且隱藏右邊的滑動條。重新計算listView的項高度,下面直接上程式碼註釋很詳細,可以貼上直接使用:

package com.jgkj.bxxc.tools;


import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListAdapter;
import android.widget.ListView;


/**
 * 專案名:  jiuguixueche
 * 包名:    com.jgkj.bxxc
 * 檔名:   Scroll_ListView_Conflict
 * 建立者:   fangzhou
 * 建立時間:  2016/11/10
 * 描述:    重新計算listView的高度
 */
public class Scroll_ListView_Conflict extends ListView {
    public Scroll_ListView_Conflict(Context context) {
        super(context);
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }


    /*
     * 解決listView和ScrollView衝突的問題
     */
    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++) { // listAdapter.getCount()返回資料項的數目
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0); // 計運算元項View 的寬高
            totalHeight += listItem.getMeasuredHeight() + 45; // 統計所有子項的總高度
        }


        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight
                + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        // listView.getDividerHeight()獲取子項間分隔符佔用的高度
        // params.height最後得到整個ListView完整顯示需要的高度
        listView.setLayoutParams(params);
    }
}