问题一描述:
最近开发的一个项目中,需要在Scrollview里面嵌套一个ListView,俗话说,一山不容二虎。两个都有滑动性质的控件放到一起不出现点什么状况就不太正常了。果然,因为我的布局里面大致是——外面一个ScrollView,里面是一层垂直的LinearLay,依次是一个LinearLayout和一个ListView;这是我想要的结果,可啪啪啪程序运行起来了,但是来到这个界面,想象中在ListView上面的LinearLay布局不见了,其实是被推上去了,推到了手机屏幕之外,ListView顶了上去,需要手动往下滑才能看到。这是我要说的常见的问题之一。
原因:
1、在Activity计算窗口高度时,在ListView还没有填充数据时就已经完成了,而ScrollView嵌套的ListView还没有指定高度,所以ScrollView就会按照layout中定义的默认高度计 算;
2、ListView获取了焦点;
如何解决这个问题?(总结前辈的成果,亲测有用,推荐第二种方法,第一种治标不治本的感觉)
方法一: ScrollView.smoothScrollTo(0,0); //这个方法需要在listview数据加载完成之后再调用
方法二:ListView.setFocusable(false); //不让listview获取焦点
在ListView的父布局中添加获取焦点的代码,android:focusableInTouchMode="true" ; android:focusable="true;
问题二描述:
在ScrollView里面嵌套ListView出现的一种更常见的问题是,ListView的item显示不全,只能看到一项
原因:
ScrollView无法正确测量到recyclerview的高度
解决方法:
写一个类继承自ListView,重新编写获取ListView高度的方法,代码如下:
public static void setListViewHeightBasedOnChildren(ListView listView) {
//获得adapter
MyAdapter adapter = (MyAdapter) listView.getAdapter();
if (adapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0; i < adapter.getCount(); i++) {
View listItem = adapter.getView(i, null, listView);
listItem.measure(0, 0);
//计算总高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
//计算分割线高度
params.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));
//给listview设置高度
listView.setLayoutParams(params);
}
(附:如果ScrollView里面嵌套Recyclerview则不会出现问题二,但是毕竟两个都是可以滑动的,如果不作任何处理会有一定的卡顿滑动的时候,这个问题可以这么处理:
重写LayoutManager的这个方法:
public void setScrollEnabled(boolean scrollEnabled) {
isScrollEnabled = scrollEnabled;
}
)
总结:以上为个人总结的知识,如果有错误,请指正,欢迎任何的建议或知识分享!