Android ListView、ExpandableListView只在ScrollView中占一行的高度(不能自适应)
在开发的过程当中,由于手机屏幕的大小的限制,我们经常需要使用滑动的方式,来显示更多的内容。在最近的工作中,遇见一个需求,需要将ListView、ExpandableListView嵌套到ScrollView中显示。于是乎有了如下布局:
<ScrollView android:id="@+id/mScrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/GoodsCarFenge"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ExpandableListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/mScrollView" android:layout_centerHorizontal="true" android:layout_gravity="center_horizontal" android:background="@drawable/rect_gray_red" android:onClick="OnBack" android:text="修改订单" /> </LinearLayout> </ScrollView>
但是ListView(ExpandableListView)只有一行
在查阅的各种文档和资料后,发现在ScrollView中嵌套ListView空间,无法正确的计算ListView的大小,故可以通过代码,根据当前的ListView的列表项计算列表的尺寸。实现代码如下:
public class MainActivity extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView1); String[] adapterData = new String[] { "Afghanistan", "Albania",… … "Bosnia"}; listView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,adapterData)); setListViewHeightBasedOnChildren(listView); }
/**
*计算ListView高度,在父布局中自适应
*/ public void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目 View listItem = listAdapter.getView(i, null, listView); // 计算子项View 的宽高 listItem.measure(0, 0); // 统计所有子项的总高度 totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1)); // listView.getDividerHeight()获取子项间分隔符占用的高度 // params.height最后得到整个ListView完整显示需要的高度 listView.setLayoutParams(params); } }
此问题,结!
另外,android.view.InflateException: Binary XML file line #30: ScrollView can host only one direct child
意思:ScrollView只能有一个子View
解决办法:ScrollView里面放个Layout(随便什么Layout都可),在将所需要的View放在Layout中即可!