Android 中ScrollView嵌套GridView,ListView的實(shí)例
Android 中ScrollView嵌套GridView,ListView的實(shí)例
在Android開(kāi)發(fā)中,經(jīng)常有一些UI需要進(jìn)行固定style的動(dòng)態(tài)布局,然而由于現(xiàn)在的UI都喜歡把一個(gè)界面拉的很長(zhǎng),所以我們很多情況下需要使用ScrollView來(lái)嵌套列表控件來(lái)實(shí)現(xiàn)UI。這樣就導(dǎo)致了很多不順心的問(wèn)題。
問(wèn)題一:列表控件顯示不完全
原因是嵌套情況下,ScrollView不能正確的計(jì)算列表控件的高度。
有兩種解決方案
方案一
在適配器賦值完成后代碼動(dòng)態(tài)計(jì)算列表的高度。這里貼出ListView的計(jì)算代碼,GridView的計(jì)算方式類似,不過(guò)需要考慮列數(shù),下面代碼沒(méi)有加上列表控件padding的計(jì)算,如果你設(shè)置了這個(gè)屬性,需要加上計(jì)算代碼
public void setListViewHeightBasedOnChildren(ListView listView) {
// 獲取ListView對(duì)應(yīng)的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
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);
// 計(jì)算子項(xiàng)View 的寬高
listItem.measure(0, 0);
// 統(tǒng)計(jì)所有子項(xiàng)的總高度
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()獲取子項(xiàng)間分隔符占用的高度
// params.height最后得到整個(gè)ListView完整顯示需要的高度
listView.setLayoutParams(params);
}
方案二
重寫列表控件的onMeasure方法,這種方案不會(huì)出現(xiàn)列表控件本身的滾動(dòng)條,并且viewholder復(fù)用機(jī)制會(huì)失效
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(1 << 16, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
方案一代碼多,需要多次寫,建議寫成工具類方便調(diào)用;方案二在數(shù)據(jù)量大到不能一屏顯示完的情況下會(huì)有性能問(wèn)題,而且快速滑動(dòng)的時(shí)候ScrollView會(huì)不停的去計(jì)算列表控件的高度。賊影響繪制性能。
兩種方案有利有弊,大家自己取舍
問(wèn)題二:列表控件自動(dòng)獲取焦點(diǎn),導(dǎo)致ScrollView自動(dòng)滾動(dòng)到列表控件所在的位置
這個(gè)問(wèn)題其實(shí)有很多種解決方案,歸結(jié)起來(lái)是兩種。
方案一
等待列表控件數(shù)據(jù)全部加載完成后(包括圖片加載)調(diào)用ScrollView.fullScroll(ScrollView.FOCUS_UP);
方法讓ScrollView滾動(dòng)到頂部。這個(gè)加載完成的時(shí)間不好控制,搞得不好會(huì)有滾動(dòng)動(dòng)畫出現(xiàn),很尷尬的事情。
方案二
重寫列表控件的如下兩個(gè)方法,使之固定返回false
@Override
public boolean isFocused() {
return false;
}
@Override
public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
return false;
}
兩種方案的優(yōu)缺點(diǎn)很明顯,喔,第二種方案的缺點(diǎn)我目前沒(méi)發(fā)現(xiàn)。如果你這么使用發(fā)現(xiàn)了什么坑,請(qǐng)留言告知
問(wèn)題三 滑動(dòng)沖突
解決起來(lái)也離不開(kāi)幾個(gè)要點(diǎn),不過(guò)首先你得熟悉view的事件傳遞
你需要根據(jù)情況決定重寫列表控件與ScrollView的如下幾個(gè)方法,根據(jù)情況給方法返回不同的bool值來(lái)告訴控件是否攔截或者傳遞事件,需要哪個(gè)控件相應(yīng)哪個(gè)方向的滾動(dòng)事件就攔截哪個(gè)方向的事件傳遞,作為一個(gè)有追求的開(kāi)發(fā)者,切記不要一通亂攔截
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
給個(gè)小彩蛋
getParent().requestDisallowInterceptTouchEvent(boolean b);
這一句代碼可以在子控件里決定是否讓父容器獲取事件
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
解決Android Studio4.1沒(méi)有Gsonfomat插件,Plugin “GsonFormat” is inco
這篇文章主要介紹了解決Android Studio4.1沒(méi)有Gsonfomat插件,Plugin “GsonFormat” is incompatible (supported only in IntelliJ IDEA)的問(wèn)題 ,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-12-12
Android中自定義Window Title樣式實(shí)例
這篇文章主要介紹了Android中自定義Window Title樣式實(shí)例,本文給出效果預(yù)覽和實(shí)現(xiàn)方法,需要的朋友可以參考下2015-01-01
Android簡(jiǎn)單實(shí)現(xiàn)屏幕下方Tab菜單的方法
這篇文章主要介紹了Android簡(jiǎn)單實(shí)現(xiàn)屏幕下方Tab菜單的方法,簡(jiǎn)單分析了Android實(shí)現(xiàn)tab菜單所涉及的界面布局及功能相關(guān)操作技巧,需要的朋友可以參考下2016-08-08
Android View轉(zhuǎn)換為Bitmap實(shí)現(xiàn)應(yīng)用內(nèi)截屏功能
這篇文章主要介紹了Android View轉(zhuǎn)換為Bitmap實(shí)現(xiàn)應(yīng)用內(nèi)截屏功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09
Android實(shí)現(xiàn)文字滾動(dòng)播放效果的代碼
這篇文章主要介紹了Android實(shí)現(xiàn)文字滾動(dòng)播放效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Android Studio 4.1沒(méi)有GsonFormat插件的解決
這篇文章主要介紹了Android Studio 4.1沒(méi)有GsonFormat插件的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Android 打開(kāi)網(wǎng)絡(luò)上pdf文件
本文主要介紹了Android打開(kāi)網(wǎng)絡(luò)上pdf文件的方法,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04
Android?ANR分析trace文件的產(chǎn)生流程詳情
這篇文章主要介紹了Android?ANR分析trace文件的產(chǎn)生流程詳情,文章圍繞主題展開(kāi)相詳細(xì)的內(nèi)容介紹,需要的朋友可以參考一下2022-07-07

