ScrollView嵌套listView、Gridview问题

今天在做项目的过程中,遇到了内容过多需要滚动的情况,于是我在布局外面嵌套了一层ScrollView,由于里面使用了ListView以及GridView,测试的时候出现了一个问题:ListView和GridView只展示一行的高度
解决思路:
自定义View,重写高度测量方法,重新设置高度
实现方法:

public class NoScrollListView extends ListView {
    public NoScrollListView(Context context) {
        super(context);
    }

    public NoScrollListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NoScrollListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

GridView的实现同理。

将布局中的ListView和GridView设置为自定义的ListView和GridView后,测试发现页面已经可以滚动,但是却出现了另一个问题:ScrollView的默认位置不是最顶部,而是底部。
原因:ListView获取了焦点
解决方法:
1.在代码里去掉listview的焦点

lv.setFocusable(false);

2.跟EditText一样,在父元素的属性下面加上下面这两行即可

android:focusableInTouchMode=”true” 
android:focusable=”true

3.最开始的时候让最上面其中一个控件获得焦点,滚动条自然就到顶部去了

txtBaseMsg.setFocusable(true); 
txtBaseMsg.setFocusableInTouchMode(true); 
txtBaseMsg.requestFocus();

4.在listview数据加载完成后调用下面方法,滑动到顶部

myScrollView.smoothScrollTo(0,20);

参考:https://blog.csdn.net/jiaoyaning1210/article/details/51084246

你可能感兴趣的:(Android)