首页 > 代码库 > 安卓开发ScrollView嵌套ListView只显示一行

安卓开发ScrollView嵌套ListView只显示一行

在用列表控件做一个“更多功能”的界面的时候

 1 <?xml version="1.0" encoding="utf-8"?> 2 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  3 android:id="@+id/ScrollView" 4  android:layout_width="fill_parent"  5 android:layout_height="wrap_content"  6 android:scrollbars="vertical">  7  8 <LinearLayout 9     android:layout_width="match_parent"10     android:layout_height="fill_parent"11     android:orientation="vertical" >12 13     <ListView14         android:id="@+id/list_more_top"       15         android:layout_width="match_parent"16         android:layout_height="fill_parent" >17     </ListView>18     <ImageView19         android:id="@+id/imageView1"20         android:layout_width="fill_parent"21         android:layout_height="wrap_content"22         android:src=http://www.mamicode.com/"@drawable/divider" />23     <ListView24         android:id="@+id/list_more_center"       25         android:layout_width="match_parent"26         android:layout_height="wrap_content" >27     </ListView>28     <ImageView29         android:id="@+id/imageView2"30         android:layout_width="fill_parent"31         android:layout_height="wrap_content"32         android:src=http://www.mamicode.com/"@drawable/divider" />33     <ListView34         android:id="@+id/list_more_buttom"       35         android:layout_width="match_parent"36         android:layout_height="wrap_content" >37     </ListView>38 </LinearLayout>39 </ScrollView>

原本用ScrollView嵌套ListView   但是在测试的时候 ListView列表只显示一列! 这不是我希望得到的

我希望的是可以整个拖动三个列表

于是上网查询  发现的问题所在

在ScrollView中嵌套ListView空间,无法正确的计算ListView的大小,导致只显示列表第一项

故可以通过代码,根据当前的ListView的列表项计算列表的尺寸。

  1 package songsong;  2   3 import com.example.xqx_tea.R;  4   5 import android.app.Activity;  6 import android.app.AlertDialog;  7 import android.app.Notification.Builder;  8 import android.content.DialogInterface;  9 import android.content.Intent; 10 import android.os.Bundle; 11 import android.app.AlertDialog; 12 import android.view.View; 13 import android.view.ViewGroup; 14 import android.view.Window; 15 import android.widget.AdapterView; 16 import android.widget.AdapterView.OnItemClickListener; 17 import android.widget.ArrayAdapter; 18 import android.widget.ListAdapter; 19 import android.widget.ListView; 20  21 public class MenuMore extends Activity{ 22     ListView list_more_top; 23     ListView list_more_center; 24     ListView list_more_buttom; 25      26     @Override 27     protected void onCreate(Bundle savedInstanceState) { 28         // TODO Auto-generated method stub 29         super.onCreate(savedInstanceState); 30         requestWindowFeature(Window.FEATURE_NO_TITLE); 31     setContentView(R.layout.menu_more); 32  33     ListView list_more_top = (ListView) findViewById(R.id.list_more_top); 34     ListView list_more_center = (ListView) findViewById(R.id.list_more_center); 35     ListView list_more_buttom = (ListView) findViewById(R.id.list_more_buttom); 36     String[] adapterData_top = new String[] { "饮茶时刻表", "小茶叶大妙用","中国十大名茶"}; 37     list_more_top.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,adapterData_top)); 38      39     String[] adapterData_center = new String[] { "使用帮助", "意见反馈","软件介绍"}; 40     list_more_center.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,adapterData_center));    41      42     String[] adapterData_buttom = new String[] { "检查更新", "退出软件"}; 43     list_more_buttom.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,adapterData_buttom));    44  45     setListViewHeightBasedOnChildren(list_more_top);  46     setListViewHeightBasedOnChildren(list_more_center); 47     setListViewHeightBasedOnChildren(list_more_buttom); 48  49      50      51     //为列表视图中选中的项添加响应事件 52     list_more_top.setOnItemClickListener(new OnItemClickListener() { 53  54         @Override 55         public void onItemClick(AdapterView<?> parent, View arg1, int pos, 56                 long id) { 57             // TODO Auto-generated method stub 58              59         } 60     }); 61      62   //为列表视图中选中的项添加响应事件 63     list_more_center.setOnItemClickListener(new OnItemClickListener() { 64  65         @Override 66         public void onItemClick(AdapterView<?> parent, View arg1, int pos, 67                 long id) { 68             // TODO Auto-generated method stub 69              70         } 71     }); 72      73   //为列表视图中选中的项添加响应事件 74     list_more_buttom.setOnItemClickListener(new OnItemClickListener() { 75  76         @Override 77         public void onItemClick(AdapterView<?> parent, View arg1, int pos, 78                 long id) { 79              80             // TODO Auto-generated method stub 81             if(1 == id) 82                 { 83                     finish(); 84                 } 85             if(0 == id) 86                 { 87                 Intent intent = new Intent(); 88                 intent.setClass(MenuMore.this, More_submitdeal.class); 89                 startActivity(intent); 90                 } 91              92         } 93     }); 94     } 95      96     public void setListViewHeightBasedOnChildren(ListView listView) {    97                 // 获取ListView对应的Adapter    98                 ListAdapter listAdapter = listView.getAdapter();    99                 if (listAdapter == null) {   100                     return;   101                 }   102            103                 int totalHeight = 0;   104                 for (int i = 0, len = listAdapter.getCount(); i < len; i++) {   105                     // listAdapter.getCount()返回数据项的数目   106                     View listItem = listAdapter.getView(i, null, listView);   107                     // 计算子项View 的宽高   108                     listItem.measure(0, 0);    109                     // 统计所有子项的总高度   110                     totalHeight += listItem.getMeasuredHeight();    111                 }   112           113                ViewGroup.LayoutParams params = listView.getLayoutParams();   114                 params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));   115                 // listView.getDividerHeight()获取子项间分隔符占用的高度   116                 // params.height最后得到整个ListView完整显示需要的高度   117                 listView.setLayoutParams(params);   118             }   119 120 121 }

 

 给三个列表分别求出ListView完全显示需要的高度 便可以整体上下滑动三个列表了

技术分享

 

安卓开发ScrollView嵌套ListView只显示一行