Android ScrollView与ListView冲突的解决办法

问题:

ScrollView嵌套ListView,出现ListView内容无法滑动的问题。

原因:

ListView滚动条无法获取焦点。

解决方法:

ListView出现滚动是因为内容大于其所要展现的高度,归根其原因就是内容太长,溢出屏幕之外,无法查看,所以要滚动内容来辅助查看。
ScrollView本身就是为了解决内容溢出的问题而存在的,那么ListView就无需滚动,只要计量好ListView高度,展现在ScrollView当中即可。

如何让ListView的高度等于内容高度?只需要改变其测量模式即可。

首先新建一个 MyListView 的类继承 ListView 重写onMeasure()方法:

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
    // 重写父类onMeasure方法,改变模式
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // 调用MeasureSpec类的makeMeasureSpec方法传入测量值和测量模式,heightMeasureSpec的前两位是模式,后面的才是高度
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);
        // 调用父类传入测量值
        super.onMeasure(widthMeasureSpec,heightMeasureSpec);
    }
}

上述代码其实只是为了改变ListView的测量模式
接下来在布局文件中像使用组件一样使用该类即可,注意:引入自定义组件要包含完整路径名。

posted @ 2022-05-10 21:03  maplerain  阅读(130)  评论(0编辑  收藏  举报