前言
有些需求中界面里面除了listview還有其他內(nèi)容需要顯示蒲犬,而且內(nèi)容還不少鸦采,這樣的話交給listview的空間就少了很多,這樣就得嵌套一層scrollview來(lái)讓整個(gè)界面都可以滑動(dòng),才能完整的看到listview,不至于就那么一小塊地方在那里上下滑動(dòng)蕴茴。
然后在scroll里面嵌套listview問(wèn)題就出來(lái)了,listview只顯示了一行或者兩行數(shù)據(jù)姐直,這就蛋疼了倦淀,當(dāng)然可以手動(dòng)給listview設(shè)置一個(gè)高度,但是這顯然不能適配所有手機(jī)屏幕的顯示声畏。這里記錄一下解決方式撞叽。
解決一
我之前采取的方式是重新手動(dòng)計(jì)算ListView高度,代碼如下:
public class UIUtil {
public static void setListViewHeightBasedOnChildren(ListView listView) {
//獲取ListView對(duì)應(yīng)的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()返回?cái)?shù)據(jù)項(xiàng)的數(shù)目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); //計(jì)算子項(xiàng)View 的寬高
totalHeight += listItem.getMeasuredHeight(); //統(tǒng)計(jì)所有子項(xiàng)的總高度
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
//listView.getDividerHeight()獲取子項(xiàng)間分隔符占用的高度
//params.height最后得到整個(gè)ListView完整顯示需要的高度
listView.setLayoutParams(params);
}
}
然后在用到listview的地方再調(diào)用就行了插龄。
問(wèn)題
然鵝昨天發(fā)現(xiàn)會(huì)在oppo愿棋,系統(tǒng)版本4.2.2上面會(huì)報(bào)空指針,我6.0系統(tǒng)沒(méi)問(wèn)題辫狼。具體原因沒(méi)有沒(méi)有探究初斑,因?yàn)槲乙冉鉀Q問(wèn)題辛润,報(bào)錯(cuò)代碼來(lái)自于這一行:
listItem.measure(0, 0);
解決二
然后我就換了另外一種方式膨处,自定義listview见秤,重寫(xiě)onMeasure方法:
@Override
/**
* 重寫(xiě)該方法,達(dá)到使ListView適應(yīng)ScrollView的效果
*/
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
這里主要是對(duì)高度進(jìn)行了重繪真椿,MeasureSpec.AT_MOST測(cè)量模式:The child can be as large as it wants up to the specified size.需要展示的子view會(huì)盡量大到它具體的大小鹃答。強(qiáng)行設(shè)置AT_MOST來(lái)測(cè)量ListView自適應(yīng)。
別忘記重新?lián)Q控件引用突硝。
然后就是進(jìn)入界面的時(shí)候测摔,會(huì)直接定位到listview的頂部,解決:
scrollview.smoothScrollTo(0, 0);
問(wèn)題
嚴(yán)重的性能問(wèn)題解恰,根據(jù)官方設(shè)計(jì)建議锋八,ListView其實(shí)是禁止放在ScrollView等垂直滾動(dòng)視圖中的,具體說(shuō)明參看Android應(yīng)用性能優(yōu)化系列視圖篇——ListView自適應(yīng)導(dǎo)致的嚴(yán)重性能問(wèn)題,強(qiáng)行放置的結(jié)果就是ScrollView中嵌有列表的頁(yè)面可能會(huì)卡出翔护盈,文章中也給出了幾點(diǎn)建議挟纱。但是我使用的場(chǎng)景是不會(huì)用大量數(shù)據(jù)的,性能再耗也不會(huì)卡/姚明笑~
解決三
但是數(shù)據(jù)量大的怎么辦呢腐宋?上面引文中提到了一個(gè)自定義控件紊服,SimulateListView或許可以滿足需求,但是我木有嘗試胸竞,這里做一個(gè)記錄而已欺嗤,以備不時(shí)之需。
這次沒(méi)有代碼
本文作者:paradoxie
個(gè)人主頁(yè):謝盒盒的小黑屋卫枝,不止說(shuō)技術(shù)
簡(jiǎn)書(shū)地址:簡(jiǎn)書(shū)主頁(yè)煎饼,專(zhuān)注技術(shù)類(lèi)
github地址:paradoxie
轉(zhuǎn)載請(qǐng)注明出處,蟹蟹!
-------我的夢(mèng)想真的是做一條咸魚(yú)校赤!