1、当listview的item的高度固定时候,自定义ListView,计算高度
自定义listview
public class MyListView extends ListView {
public boolean isOnMeasure = false;
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);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
isOnMeasure = true;
super.onMeasure(widthMeasureSpec, expandSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
isOnMeasure = false;
super.onLayout(changed, l, t, r, b);
}
}
使用:
<com.jumploo.mainPro.ui.home.MyListView
android:id="@+id/view_hot_article"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.jumploo.mainPro.ui.home.MyListView>
2、在使用listview中,当listview中item高度不固定时候,则需要计算item高度
在adapter设置数据之后再调用一下方法,因为getview()方法之后,才知道具体高度
public void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
ViewGroup.LayoutParams params = listView.getLayoutParams();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
View view;
for (int i = 0; i < listAdapter.getCount(); i++) {
view = listAdapter.getView(i, null, listView);
//宽度为屏幕宽度
int i1 = View.MeasureSpec.makeMeasureSpec(getScreenWidth(mContext),
View.MeasureSpec.EXACTLY);
//根据屏幕宽度计算高度
int i2 = View.MeasureSpec.makeMeasureSpec(i1, View.MeasureSpec.UNSPECIFIED);
view.measure(i1, i2);
totalHeight += view.getMeasuredHeight();
}
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
public int getScreenWidth(Context context) {
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
return display.getWidth();
}