Android筆記之:在ScrollView中嵌套ListView的方法
更新時(shí)間:2013年05月23日 11:01:18 作者:
本篇文章是對(duì)Android中在ScrollView中嵌套ListView的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
前幾天因?yàn)轫?xiàng)目的需要,要在一個(gè)ListView中放入另一個(gè)ListView,也即在一個(gè)ListView的每個(gè)ListItem中放入另外一個(gè)ListView。但剛開(kāi)始的時(shí)候,會(huì)發(fā)現(xiàn)放入的小ListView會(huì)顯示不完全,它的高度始終有問(wèn)題。上網(wǎng)查了下,發(fā)現(xiàn)別人也有遇到這樣的問(wèn)題,而大多數(shù)人都不推薦這樣的設(shè)計(jì),因?yàn)槟J(rèn)情況下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是無(wú)法計(jì)算的。
又搜索了一下,發(fā)現(xiàn)有StackOverflow上的牛人已經(jīng)解決了這個(gè)問(wèn)題,經(jīng)過(guò)試驗(yàn)發(fā)現(xiàn)是可以解決問(wèn)題的,它的思路就是在設(shè)置完ListView的Adapter后,根據(jù)ListView的子項(xiàng)目重新計(jì)算ListView的高度,然后把高度再作為L(zhǎng)ayoutParams設(shè)置給ListView,這樣它的高度就正確了.
以下是源碼:
public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
只要在設(shè)置ListView的Adapter后調(diào)用此靜態(tài)方法即可讓ListView正確的顯示在其父ListView的ListItem中。但是要注意的是,子ListView的每個(gè)Item必須是LinearLayout,不能是其他的,因?yàn)槠渌腖ayout(如RelativeLayout)沒(méi)有重寫(xiě)onMeasure(),所以會(huì)在onMeasure()時(shí)拋出異常。
在ScrollView中嵌套ListView(或者ScrollView)的另外一個(gè)問(wèn)題就是,子ScrollView中無(wú)法滑動(dòng)的(如果它沒(méi)有顯示完全的話),因?yàn)榛瑒?dòng)事件會(huì)被父ScrollView吃掉,如果想要讓子ScrollView也可以滑動(dòng),只能強(qiáng)行截取滑動(dòng)事件,有牛人在論壇中發(fā)過(guò)代碼說(shuō)可以。雖然我沒(méi)有親自試過(guò),但估計(jì)是可行的。
雖然在ScrollView中顯示ScrollView在技術(shù)上的難題可以攻破,但是這樣的設(shè)計(jì)卻是非常差的用戶體驗(yàn)因?yàn)橛脩魰?huì)不容易看到和操作子ScrollView中的內(nèi)容。比如好的設(shè)計(jì)是,父ListView的每個(gè)Item只顯示概括性的描述,然后點(diǎn)擊其Item會(huì)進(jìn)入另外一個(gè)頁(yè)面來(lái)詳細(xì)描述和展示以及對(duì)這個(gè)Item的操作。
又搜索了一下,發(fā)現(xiàn)有StackOverflow上的牛人已經(jīng)解決了這個(gè)問(wèn)題,經(jīng)過(guò)試驗(yàn)發(fā)現(xiàn)是可以解決問(wèn)題的,它的思路就是在設(shè)置完ListView的Adapter后,根據(jù)ListView的子項(xiàng)目重新計(jì)算ListView的高度,然后把高度再作為L(zhǎng)ayoutParams設(shè)置給ListView,這樣它的高度就正確了.
以下是源碼:
復(fù)制代碼 代碼如下:
public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
只要在設(shè)置ListView的Adapter后調(diào)用此靜態(tài)方法即可讓ListView正確的顯示在其父ListView的ListItem中。但是要注意的是,子ListView的每個(gè)Item必須是LinearLayout,不能是其他的,因?yàn)槠渌腖ayout(如RelativeLayout)沒(méi)有重寫(xiě)onMeasure(),所以會(huì)在onMeasure()時(shí)拋出異常。
在ScrollView中嵌套ListView(或者ScrollView)的另外一個(gè)問(wèn)題就是,子ScrollView中無(wú)法滑動(dòng)的(如果它沒(méi)有顯示完全的話),因?yàn)榛瑒?dòng)事件會(huì)被父ScrollView吃掉,如果想要讓子ScrollView也可以滑動(dòng),只能強(qiáng)行截取滑動(dòng)事件,有牛人在論壇中發(fā)過(guò)代碼說(shuō)可以。雖然我沒(méi)有親自試過(guò),但估計(jì)是可行的。
雖然在ScrollView中顯示ScrollView在技術(shù)上的難題可以攻破,但是這樣的設(shè)計(jì)卻是非常差的用戶體驗(yàn)因?yàn)橛脩魰?huì)不容易看到和操作子ScrollView中的內(nèi)容。比如好的設(shè)計(jì)是,父ListView的每個(gè)Item只顯示概括性的描述,然后點(diǎn)擊其Item會(huì)進(jìn)入另外一個(gè)頁(yè)面來(lái)詳細(xì)描述和展示以及對(duì)這個(gè)Item的操作。
您可能感興趣的文章:
- Android之ScrollView嵌套ListView和GridView沖突的解決方法
- Android ListView的item中嵌套ScrollView的解決辦法
- Android編程之截屏實(shí)現(xiàn)方法(包括scrollview與listview)
- Android ScrollView嵌套ExpandableListView顯示不正常的問(wèn)題的解決辦法
- Android 中ScrollView嵌套GridView,ListView的實(shí)例
- Android ListView與ScrollView沖突的解決方法總結(jié)
- Android ScrollView 下嵌套 ListView 或 GridView出現(xiàn)問(wèn)題解決辦法
- Android 中ScrollView與ListView沖突問(wèn)題的解決辦法
- Android開(kāi)發(fā)實(shí)現(xiàn)ScrollView中嵌套兩個(gè)ListView的方法
相關(guān)文章
Android自定義方框EditText注冊(cè)驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了Android自定義方框EditText注冊(cè)驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06學(xué)習(xí)Android自定義Spinner適配器
這篇文章主要為大家詳細(xì)介紹了學(xué)習(xí)Android自定義Spinner適配器的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05SimpleCommand框架介紹以及簡(jiǎn)單使用(一)
這篇文章主要為大家詳細(xì)介紹了SimpleCommand框架以及簡(jiǎn)單使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Android實(shí)現(xiàn)系統(tǒng)狀態(tài)欄的隱藏和顯示功能
這篇文章主要介紹了Android實(shí)現(xiàn)系統(tǒng)狀態(tài)欄的隱藏和顯示功能,文中還給大家?guī)?lái)四種方法,大家可以根據(jù)自己需要參考下2018-07-07android 下載時(shí)文件名是中文和空格會(huì)報(bào)錯(cuò)解決方案
項(xiàng)目中遇到了下載文件文件名是中文而且還有空格如果不對(duì)連接進(jìn)行處理下載就會(huì)報(bào)錯(cuò)要想解決這個(gè)問(wèn)題只需對(duì)你的url進(jìn)行編碼然后替換空格用編碼表示,感興趣的朋友可以詳細(xì)了解下2013-01-01Android實(shí)現(xiàn)多參數(shù)文件和數(shù)據(jù)上傳
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)多參數(shù)文件和數(shù)據(jù)上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android實(shí)現(xiàn)搜索本地音樂(lè)的方法
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)搜索本地音樂(lè)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Android RecyclerView使用入門(mén)介紹
RecyclerView是Android一個(gè)更強(qiáng)大的控件,其不僅可以實(shí)現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。其可以實(shí)現(xiàn)數(shù)據(jù)縱向滾動(dòng),也可以實(shí)現(xiàn)橫向滾動(dòng)(ListView做不到橫向滾動(dòng))。接下來(lái)講解RecyclerView的用法2022-10-10