日积月累:ScrollView嵌套ListView只显示一行

来源:互联网 发布:美的售后软件 编辑:程序博客网 时间:2024/05/29 06:58

在开发的过程当中,由于手机屏幕的大小的限制,我们经常需要使用滑动的方式,来显示更多的内容。在最近的工作中,遇见一个需求,需要将ListView嵌套到ScrollView中显示。于是乎有了如下布局: 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:background="#FFE1FF"     android:orientation="vertical" >     <ScrollView         android:layout_width="match_parent"         android:layout_height="match_parent" >         <LinearLayout             android:layout_width="match_parent"             android:layout_height="match_parent" >             <ListView                 android:id="@+id/listView1"                 android:layout_width="match_parent"                 android:layout_height="match_parent"                 android:fadingEdge="vertical"                 android:fadingEdgeLength="5dp" />         </LinearLayout>     </ScrollView> </LinearLayout> 

运行程序,如下结果,无论你如何调整layout_width,layout_height属性,ListView列表只显示一列 


在查阅的各种文档和资料后,发现在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);     }     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);     } } 
运行结果,OK问题搞定,打完收工 


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 中国建设银行登录密码忘了怎么办 中国建设银行登录密码忘记了怎么办 公司车辆怎么办换新能源牌 杭州新能源汽车牌照外地人怎么办 建行登录密码忘了怎么办 新捷达epc灯亮怎么办 捷达车玻璃升降偏离怎么办 交金中断一个月怎么办 博士拟录取没导师怎么办 保研联系导师后怎么办 特别害怕和导师交流怎么办 面试工资要少了怎么办 一面工资要低了怎么办 家乐卡到期本金还一半怎么办 新三板公司没有资不抵债没钱怎么办 户户通智能卡坏了怎么办 秦岭云无法回看怎么办 身份证在火车站丢了怎么办 到火车站发现身份证丢了怎么办 广电宽带太慢了怎么办 车有后雷达想装前置雷达怎么办 现代朗动油耗大怎么办 雷达线雕头里有水怎么办 上古卷轴5免疫死亡奴役怎么办 dw手表时针不动了怎么办 雷达陶瓷表壳摔坏了怎么办 雷达表盘摔坏了怎么办 雷达测速60超了怎么办 卡西欧手表电池没电了怎么办 审稿人让引用他的文章怎么办 考二建未从事该行业满两年怎么办 2档换3档离合器怎么办 高铁车票丢了怎么办 事业编制调动原单位不同意怎么办 想去铁路上工作怎么办 房产权50年以后怎么办 在香港手机没电怎么办 学校官网登陆忘记密码怎么办 网上申报学校忘记密码怎么办 专转本想换专业怎么办 发生工伤没有平均公资怎么办?