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

来源:互联网 发布:微信商城java源码下载 编辑:程序博客网 时间:2024/06/07 03:52

原地址:http://www.cnblogs.com/zhwl/p/3333585.html


在开发的过程当中,由于手机屏幕的大小的限制,我们经常需要使用滑动的方式,来显示更多的内容。在最近的工作中,遇见一个需求,需要将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问题搞定,打完收工 

 



0 0
原创粉丝点击