前言
有些需求中界面里面除了listview還有其他內容需要顯示,而且內容還不少,這樣的話交給listview的空間就少了很多,這樣就得嵌套一層scrollview來讓整個界面都可以滑動,才能完整的看到listview,不至于就那么一小塊地方在那里上下滑動。
然后在scroll里面嵌套listview問題就出來了,listview只顯示了一行或者兩行數據,這就蛋疼了,當然可以手動給listview設置一個高度,但是這顯然不能適配所有手機屏幕的顯示。這里記錄一下解決方式。
解決一
我之前采取的方式是重新手動計算ListView高度,代碼如下:
public class UIUtil {
public static void setListViewHeightBasedOnChildren(ListView listView) {
//獲取ListView對應的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) { //listAdapter.getCount()返回數據項的數目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); //計算子項View 的寬高
totalHeight += listItem.getMeasuredHeight(); //統計所有子項的總高度
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
//listView.getDividerHeight()獲取子項間分隔符占用的高度
//params.height最后得到整個ListView完整顯示需要的高度
listView.setLayoutParams(params);
}
}
然后在用到listview的地方再調用就行了。
問題
然鵝昨天發現會在oppo,系統版本4.2.2上面會報空指針,我6.0系統沒問題。具體原因沒有沒有探究,因為我要先解決問題,報錯代碼來自于這一行:
listItem.measure(0, 0);
解決二
然后我就換了另外一種方式,自定義listview,重寫onMeasure方法:
@Override
/**
* 重寫該方法,達到使ListView適應ScrollView的效果
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
這里主要是對高度進行了重繪,MeasureSpec.AT_MOST測量模式:The child can be as large as it wants up to the specified size.需要展示的子view會盡量大到它具體的大小。強行設置AT_MOST來測量ListView自適應。
別忘記重新換控件引用。
然后就是進入界面的時候,會直接定位到listview的頂部,解決:
scrollview.smoothScrollTo(0, 0);
問題
嚴重的性能問題,根據官方設計建議,ListView其實是禁止放在ScrollView等垂直滾動視圖中的,具體說明參看Android應用性能優化系列視圖篇——ListView自適應導致的嚴重性能問題,強行放置的結果就是ScrollView中嵌有列表的頁面可能會卡出翔,文章中也給出了幾點建議。但是我使用的場景是不會用大量數據的,性能再耗也不會卡/姚明笑~
解決三
但是數據量大的怎么辦呢?上面引文中提到了一個自定義控件,SimulateListView或許可以滿足需求,但是我木有嘗試,這里做一個記錄而已,以備不時之需。
這次沒有代碼
本文作者:paradoxie
個人主頁:謝盒盒的小黑屋,不止說技術
簡書地址:簡書主頁,專注技術類
github地址:paradoxie
轉載請注明出處,蟹蟹!
-------我的夢想真的是做一條咸魚!