在開發的過程當中,由于手機螢幕的大小的限制,我們經常需要使用滑動的方式,來顯示更多的内容。在最近的工作中,遇見一個需求,需要将listview嵌套到scrollview中顯示。于是乎有了如下布局:
[html] view plaincopy
<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的清單項計算清單的尺寸。實作代碼如下:
[java] view plaincopy
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問題搞定,打完收工!