The vertically scrolling ScrollView should not contain another vertically scrolling widget (ListView

问题背景

今天做个界面需要在整个布局都要滚动的基础上添加一个ListView元素,整个布局滚动当然用ScrollView。但是在ScrollView+ListView的布局画好后,发现整个界面都无法滚动,而且ListView只显示了第一条元素。 查看布局提示:The vertically scrolling ScrollView should not contain another vertically scrolling widget (ListView)。

问题分析:

由上面那个提示可以看到,正常情况下ScrollView下是不允许再包含一个可滑动的View的,为什么呢? 首先要了解ScrollView的工作原理,我们常用它来布局一个内容超过当前页面,需要往下滑才能看到完整内容。 在这里,我们可以把ScrollView看作是一种特殊的、 加长版的LinearLayout(虽然它的布局不一定是线性的,但为了便于理解我们暂且这样看), 加长?有多长? 系统在加载布局时其实要知道整个布局的长度,也就是上面加长后的长度,才能将整个页面显示出来。而ListView我们知道,item个数是会动态变化的,如果在ScrollView中加入ListView会让系统无法准确加载,导致了我们开始遇到的那种情况。 查询很多资料后,得到了这个解决办法:

一种解决办法:

有网友试过,将ListView的layout_height设置为一个定值,比如说400dp,就可以有滑动的效果。 但是ListView只能显示部分元素,这不是我们想要的结果。 所以就需要一种方法可以根据ListView中Item数量,动态设置ListView的height,使全部item得到显示。

最终解决方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class = "hljs java" >    /**
      * scrollview与listview合用会出现listview只显示一行多点。此方法是为了定死listview的高度就不会出现以上状况
      * 算出listview的高度
      */
     public static void setListViewHeight(ListView listView) {
         ListAdapter listAdapter = listView.getAdapter();
         if (listAdapter == null ) {
             return ;
         }
         int totalHeight = 0 ;
         for ( int i = 0 ; i < listAdapter.getCount(); i++) {
             View listItem = listAdapter.getView(i, null , listView);
             listItem.measure( 1 , 1 );
             totalHeight += listItem.getMeasuredHeight();
         }
 
         ViewGroup.LayoutParams params = listView.getLayoutParams();
         params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1 )) + listView.getPaddingTop() + listView.getPaddingBottom();
         listView.setLayoutParams(params);
     }


你可能感兴趣的:(问题解决)