概要:本例僅提供替代思路。
原需求:實現下圖這個布局
要求:頭部菜單固定,實現Viewpager、中間的按鈕菜單,底部的listview一起能夠上下滾動。
做法:
把Viewpager、中間的按鈕菜單,底部的listview使用一個ScrollView套起來,這樣就能夠實現上下滑動。
這樣做的問題:運行程序后你會發現listview始終顯示的是第一個Item而其他的item不見了,其實不是其他的item不見了,而是其他的item被第一個item遮擋了,此時你可以滑動第一個item來看其他的item,但是當你滑動時問題又來了,你會發現你的item滑動的非常的不順暢,或者根本就沒辦法滑動,因為在你滑動時scrollview會跟着滑動,這是為什么呢?其實是你的ScrollView的滑動時間和Listview的滑動事件起沖突了,最后你會發現這樣做不行啊,這根本不是我想要的效果啊,怎么辦呢?
改進做法:
這樣哈,上面不是說ScrollView和ListView的滑動事件不是起沖突了嗎?那好,現在我們把ListView的滑動事件禁用掉,那么怎樣禁用呢?我們可以這樣,把ListView的每一項循環計算高度,這樣ListView就不會有滑動效果了。
代碼如下:使用下面的代碼要注意了,ListView的Item最好是LinearLayout,當然也可以使用RelativeLayout但是要重新定義一下RelativeLayout這里就不再細說了,大家可以到網上查查,都能找到答案的。
public void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { 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)); ((MarginLayoutParams) params).setMargins(10, 10, 10, 10); listView.setLayoutParams(params); }
好了,到此為止問題解決了。但是真的解決了嗎?是一定符合我們的需求嗎?
現在又有心需求了,要求,在ListView中的Item項中,事先隱藏item的介紹,當點擊時顯示,再次點擊時顯示。看到這個地方時有些朋友開始吐槽了,這有什么難的?不久是在item中事先隱藏一個控件點擊時顯示不就行了嗎?嗯,這個朋友說的不錯,但是給予以上代碼 ,真的能夠輕松的實現這種效果嗎?答案是否定的,當你按照你的思路改進並運行程序后你會發現,無論怎樣點擊item,隱藏的東西就是顯示不出來。這是為什么呢?那是因為你的item由於是計算過高度的所以你在點擊你的item時並沒有多於的空間來顯示你的隱藏內容。怎樣解決呢?這就要用到咱們今天說的重點了,使用一種方法代替ScrollView嵌套ListView!
改進二:
是這樣的在無意中看到stackoverflow上的一個哥們是這樣解決的,可以把:
這一部分當作ListView的頭部(header),即向lsitview中添加addheader()方法,這樣就不會出現雙滑動,也不用計算listview的item的每一項高度,就能把以上所有的問題完美的解決。
好了,文章到此結束,次篇文章主要是告訴那些有時思路會陷入死胡同中的朋友,其實有些時候換一個思路問題就會變得非常簡單。不是嗎?呵呵。。