今天在做项目的过程中,遇到了内容过多需要滚动的情况,于是我在布局外面嵌套了一层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