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

  • 相关阅读:
    【bzoj2733】[HNOI2012]永无乡 Treap启发式合并
    【bzoj1465/bzoj1045】糖果传递 数论
    【bzoj2768/bzoj1934】[JLOI2010]冠军调查/[Shoi2007]Vote 善意的投票 最小割
    【bzoj4003】[JLOI2015]城池攻占 可并堆
    【bzoj3011】[Usaco2012 Dec]Running Away From the Barn 可并堆
    【bzoj2809】[Apio2012]dispatching 贪心+可并堆
    【bzoj1455】罗马游戏 可并堆+并查集
    DOM的的概述
    wpf多程序集之间共享资源字典--CLR名称空间未定义云云
    WPF的Presenter(ContentPresenter)
  • 原文地址:https://www.cnblogs.com/xqxacm/p/4260256.html
Copyright © 2011-2022 走看看