为啥listview在scrollview中显示不全

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥listview在scrollview中显示不全相关的知识,希望对你有一定的参考价值。

参考技术A  在看本文之前请写了解一下UNSPECIFIED、EXACTLY、AT_MOST三种模式。
  在项目中经常会用到ScrollView嵌套ListView的情况。如果使用原生的ListView会出现只显示一行的情况:

  出现这个的原因是在scrollView中ListView在OnMeasure阶段无法测出实际的高度,我们需要给他设置AT_MOST模式以支持很大的高度。这时候可以自定义一个MyListView 继承自Listview,然后重写onMeasure方法即可:
  
package com.chuck.contactsdemo;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;

/**
* Created by chuck on 2015/11/26.
*/
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);


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


1234567891011121314151617181920212223242526272829

  从上边我们可以看出,我们没有改变widthMeasureSpec,仅仅是调用了makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST)方法,该方法会返回一个带有模式和大小信息的int值的,第一个参数Integer.MAX_VALUE >> 2,我们知道我们的控件的大小的最大值是用30位表示的(int占32位,其中前两位用来表示文章开头所说的三种模式)。那么Integer.MAX_VALUE来获取int值的最大值,然后右移2位,就得到这个最大值了 。因为是要最大值所以只能选择AT_MOST模式。最后 super.onMeasure()方法将我们的高度值传进去就可以使ListView内容都展示出来了。
  将布局文件中的ListView改成MyListView就ok了:
  

java scrollview嵌套listview导致listview显示不完整解决方式

/**
     * 重新计算listview高度<br/>
     * <i>
     * scrollview 嵌套 listview, 会导致listview只显示一个, 所以在listview.setAdapter之后重新计算高度<br/>
     * listview 必须是linearlayout布局
     * </i>
     *
     * @param listView listview
     */
    public void setListViewHeightBasedOnChildren(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            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 = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }

以上是关于为啥listview在scrollview中显示不全的主要内容,如果未能解决你的问题,请参考以下文章

解决在ScrollView中套用ListView显示不正常

ScrollView中嵌套ListView时,listview高度显示的问题

android中ScrollView嵌套ListView或GridView显示位置问题

ScrollView镶嵌listview显示不全的原因

android listview为啥不能滑动

java scrollview嵌套listview导致listview显示不完整解决方式