安卓开发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完全显示需要的高度 便可以整体上下滑动三个列表了

时间: 2024-08-09 06:32:03

安卓开发ScrollView嵌套ListView只显示一行的相关文章

ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法(转)

ScrollView嵌套ListView只显示一行之计算的高度不正确的解决办法 分类: android应用开发2013-12-19 09:40 1045人阅读 评论(3) 收藏 举报 AndroidScrollView嵌套ListView显示一行高度不正确 1.前言 从谷歌那里找到的ScrollView嵌套ListView只显示一行的解决办法相信很多人都遇到过,然后大部分都是用这位博主的办法解决的吧 刚开始我也是用这个办法解决的,首先感谢这位哥的大私奉献,贴上地址 http://blog.csd

Android中ScrollView嵌套ListView只显示一行的解决方案

Android中ScrollView嵌套ListView只显示一行的解决方案 解决方案1: 直接把包含ListView控件的ScrollView控件从布局文件中去除,留下ListView控件,这是最简单快捷的解决办法. 如果一定要在ScrollView中包含ListView,则参考 解决方案2: public void showlist() { List<HashMap<String, String>> dataHashMaps = new ArrayList<HashMap

一键解决ScrollView嵌套ListView只显示一行的问题

/** * 解决ScrollView嵌套ListView只显示一行的问题 * * @param listView */ private void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0;

ScrollView嵌套ListView只显示一行

错误描述 ScrollView嵌套ListView中导致ListView高度计算不正确,只显示一行. 解决方法 重写ListView的onMeasure方法,代码如下. @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_

ScrollView嵌套ListView只显示一行(转帖)

public class MainActivity extends Activity {        private ListView listView;        @Override        protected void onCreate(Bundle savedInstanceState) {            super.onCreate(savedInstanceState);            setContentView(R.layout.activity_mai

一键解决ScrollView嵌套ListView仅仅显示一行的问题

/** * 解决ScrollView嵌套ListView仅仅显示一行的问题 * * @param listView */ private void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0;

Android ScrollView中嵌套ListView只显示一行的解决办法

Android编程中,ScrollView嵌套ListView时,会无法正确的计算ListView的大小.解决的办法如下: (非原创,网上搜到的解决方法) public class MainActivity extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s

Android 嵌套GridView,ListView只显示一行的解决办法

重写ListView.GridView即可: public class MyListView extends ListView { public MyListView(Context context) { // TODO Auto-generated method stub super(context); } public MyListView(Context context, AttributeSet attrs) { // TODO Auto-generated method stub su

ScrollView中嵌套GridView,ListView只显示一行的解决办法

转载:http://blog.csdn.net/luohai859/article/details/39347583 关于为什么只显示一行,个人理解是:如果单独使用GridView和ListView,里面的内容是固定的,底层系统很容易计算出控件要占用的宽高,当外面嵌套一层ScrollView后,就能做上下或左右滑动,但能滑动多少系统不知道,这时就需要你给计算出一个滑动区域给ScrollView.而这个数值就是通过GridView和ListView中的内容总的宽高之和.有更精确的理解欢迎赐教.解决