ScrollView 与 ListView共存会存在滚动的问题,并且ListView只显示一个半Item。 当ListView的高度设定一定的值时,ListView同样地会显示对应的高度的Item。 因此我们可以计算出这个ListView的总高度,再将它设置到ListView中,那么之前的滚动,高度问题也就不存在了。
补充一点: 当你的listView每个item是确定高度,就可以使用以下的方法. 但是假如你的item不是确定高度,是会变化的.当 你的Item 里面有个textView是包括宽度(就是用户输入过多的文字,导致换行.). 建议不要使用下面的方法.
totalHeight += listItem.getMeasuredHeight();这行代码,只会根据第一行出现的宽度计算下面的item,当其中有一个不同第一行的宽度,ScrollView 会不适应当前的高度.
[代码] 获取并设置ListView高度的方法
/** 自己补充的
最好在adapter.notifyDataSetChanged()之后再使用setListViewHeightBasedOnChildren,这个方法是计算你的listView的总高度,如果你的ListView没数据,在使用这个setListViewHeightBasedOnChildren,就会只有空LIstView的高度! 所以每次使用adapter.notifyDataSetChanged() 都使用setListViewHeightBasedOnChildren.
ScrollView 默认layoutHeight是wrap_content的 你也改不了,而且子节点只能有一个.
*/
01public void setListViewHeightBasedOnChildren(ListView listView) {
02ListAdapter listAdapter = listView.getAdapter();
03if(listAdapter ==null) {
04return;
05}
06
07inttotalHeight =0;
08for(inti =0; i < listAdapter.getCount(); i++) {
09View listItem = listAdapter.getView(i,null, listView);
10listItem.measure(0,0);
11totalHeight += listItem.getMeasuredHeight();
12}
13
14ViewGroup.LayoutParams params = listView.getLayoutParams();
15params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() -1));
16((MarginLayoutParams)params).setMargins(10,10,10,10);//设置maring .
17listView.setLayoutParams(params);
18}
[代码] XML布局
01<ScrollView
02android:layout_width="fill_parent"
03android:layout_height="fill_parent"
04android:fadingEdge ="none"
05android:background="#FFF4F4F4"
06xmlns:android="http://schemas.android.com/apk/res/android"
07>
08<LinearLayout
09android:gravity="center_horizontal"
10android:orientation="vertical"
11android:background="#fff4f4f4"
12android:layout_width="fill_parent"
13android:layout_height="fill_parent"
14>
15<ListView
16android:id="@+id/moreItemsListView"
17android:layout_width="fill_parent"
18android:layout_height="fill_parent"
19android:cacheColorHint="#FFF4F4F4"
20android:dividerHeight="0.0dip"
21android:fadingEdge="none"
22/>
23</LinearLayout>
24</ScrollView>