为啥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在scrollview中显示不全的主要内容,如果未能解决你的问题,请参考以下文章
ScrollView中嵌套ListView时,listview高度显示的问题