????????這種情況是當(dāng)ScrollView嵌套ListView時(shí),ListView的高度設(shè)置為wrap_content時(shí)會(huì)產(chǎn)生焕刮,一般情況下ListView只顯示的第一個(gè)Item舶沿。
正常情況下,高度設(shè)置為“wrap_content”的ListView在測(cè)量自己的高度會(huì)使用MeasureSpec.AT_MOST這個(gè)模式高度來(lái)返回可包含住其內(nèi)容的高度配并。
而實(shí)際上當(dāng)ListView被ScrollView嵌套時(shí)括荡,ListView使用的測(cè)量模式是ScrollView傳入的MeasureSpec.UNSPECIFIED。
解決方法一:重寫ListView的onMeasure方法:
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.ListView;
public class MyListView extends ListView {
? ? public MyListView(Context context) {
? ? ? ? super(context);
? ? }
? ? public MyListView(Context context, AttributeSet attrs) {
? ? ? ? super(context, attrs);
? ? }
? ? public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
? ? ? ? super(context, attrs, defStyleAttr);
? ? }
? ? @TargetApi(Build.VERSION_CODES.LOLLIPOP)
? ? public MyListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
? ? ? ? super(context, attrs, defStyleAttr, defStyleRes);
? ? }
? ? @Override
? ? protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
? ? ? ? int newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2, // 設(shè)計(jì)一個(gè)較大的值和AT_MOST模式
? ? ? ? ? ? ? ? MeasureSpec.AT_MOST);
? ? ? ? super.onMeasure(widthMeasureSpec, newHeightMeasureSpec);//再調(diào)用原方法測(cè)量
? ? }
}
解決方法二:在Activity中動(dòng)態(tài)修改ListView的高度溉旋,注意當(dāng)ListView的子item需要根布局是LinearLayout畸冲,或需要為一個(gè)View,因?yàn)橛行┎季种袥](méi)有measure這個(gè)方法观腊,比如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);? // 獲取item高度
? ? ? ? totalHeight += listItem.getMeasuredHeight();
? ? }
? ? ViewGroup.LayoutParams params = listView.getLayoutParams();
? ? // 最后再加上分割線的高度和padding高度,否則顯示不完整梧油。
? ? params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1))+listView.getPaddingTop()+listView.getPaddingBottom();
? ? listView.setLayoutParams(params);
}
調(diào)用這個(gè)方法苫耸,把listview傳進(jìn)去就可以解決了。