scrollview里面嵌套listview是一種很不好的做法,最好還是使用一個listview,將其他需要滑動的部分添加為頭布局腳部局,或者在adapter里面將頭腳用一個標志位去判斷作為單獨的item,這樣性能是最完好的,不容易出現bug。
當然了,難免有人會用到的,會出現只顯示一個item的bug,解決辦法有兩種。一種是自定義一個WrapContentListview,很簡單的繼承自Listview,只需要重寫OnMeasure方法
public class WrapContentListView extends ListView{
public WrapContentListView(Context context) {
super(context);
}
public WrapContentListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WrapContentListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
改成這樣就好了。
第二種解決辦法:動態設置listview,去測量每個item的高度,通過for循環去疊加計算listview的總高度
/**
* 解決ScrollView嵌套ListView只顯示一條的問題
* @param listView
*/
public void setListViewHeightBasedOnChildren(ListView listView) {
// 獲取ListView對應的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
// listAdapter.getCount()返回數據項的數目
View listItem = listAdapter.getView(i,null, listView);
// 計算子項View 的寬高
listItem.measure(0, 0);
// 統計所有子項的總高度
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.invalidate();
}
注意:我在項目中遇到這兩個都用不了的情況,具體原因是我的item用的是百分比布局或者是wrapcontent那種,所以疊加的時候發生異常就不會動態計算出高度了
我們所需要做的就是把item中高度設為具體的dp值,這樣才可以使用以上兩種方法。
