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 ListView、ExpandableListView只在ScrollView中占一行的高度(不能自适应)

此问题,结!

另外,android.view.InflateException: Binary XML file line #30: ScrollView can host only one direct child

意思:ScrollView只能有一个子View
解决办法:ScrollView里面放个Layout(随便什么Layout都可),在将所需要的View放在Layout中即可!