美文网首页
listview和Scrollview使用,ListView的高

listview和Scrollview使用,ListView的高

作者: A_SHUO | 来源:发表于2018-07-25 09:54 被阅读0次

        这种情况是当ScrollView嵌套ListView时,ListView的高度设置为wrap_content时会产生,一般情况下ListView只显示的第一个Item。

正常情况下,高度设置为“wrap_content”的ListView在测量自己的高度会使用MeasureSpec.AT_MOST这个模式高度来返回可包含住其内容的高度。

而实际上当ListView被ScrollView嵌套时,ListView使用的测量模式是ScrollView传入的MeasureSpec.UNSPECIFIED。

解决方法一:重写ListView的onMeasure方法:

import android.annotation.TargetApi;

import android.content.Context;

import android.os.Build;

import android.util.AttributeSet;

import android.widget.ListView;

public class MyListView extends ListView {

    public MyListView(Context context) {

        super(context);

    }

    public MyListView(Context context, AttributeSet attrs) {

        super(context, attrs);

    }

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {

        super(context, attrs, defStyleAttr, defStyleRes);

    }

    @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2, // 设计一个较大的值和AT_MOST模式

                MeasureSpec.AT_MOST);

        super.onMeasure(widthMeasureSpec, newHeightMeasureSpec);//再调用原方法测量

    }

}

解决方法二:在Activity中动态修改ListView的高度,注意当ListView的子item需要根布局是LinearLayout,或需要为一个View,因为有些布局中没有measure这个方法,比如RelativeLayout。

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);  // 获取item高度

        totalHeight += listItem.getMeasuredHeight();

    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();

    // 最后再加上分割线的高度和padding高度,否则显示不完整。

    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1))+listView.getPaddingTop()+listView.getPaddingBottom();

    listView.setLayoutParams(params);

}

调用这个方法,把listview传进去就可以解决了。

相关文章

网友评论

      本文标题:listview和Scrollview使用,ListView的高

      本文链接:https://www.haomeiwen.com/subject/nhoumftx.html