安卓开发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 <ListView 14 android:id="@+id/list_more_top" 15 android:layout_width="match_parent" 16 android:layout_height="fill_parent" > 17 </ListView> 18 <ImageView 19 android:id="@+id/imageView1" 20 android:layout_width="fill_parent" 21 android:layout_height="wrap_content" 22 android:src="@drawable/divider" /> 23 <ListView 24 android:id="@+id/list_more_center" 25 android:layout_width="match_parent" 26 android:layout_height="wrap_content" > 27 </ListView> 28 <ImageView 29 android:id="@+id/imageView2" 30 android:layout_width="fill_parent" 31 android:layout_height="wrap_content" 32 android:src="@drawable/divider" /> 33 <ListView 34 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完全显示需要的高度 便可以整体上下滑动三个列表了
作者:听着music睡
出处:http://www.cnblogs.com/xqxacm/
Android交流群:38197636
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。