我想测量ListView
的高度,并在加载一些数据后展开它。 ListAdapter根据数据类型为项目选择不同的布局。
我试过这段代码:
public class ExpandedListView extends ListView {
[...]
@Override
protected void onDraw(Canvas canvas) {
if (getCount() != 0) {
params = getLayoutParams();
int height = 0;
for (int i = 0; i < getCount(); i++) {
height += getChildAt(i).getMeasuredHeight();
height += getDividerHeight();
}
params.height = height;
setLayoutParams(params);
}
super.onDraw(canvas);
}
[...]
但是我得到了getChildAt(i)
07-29 09:48:08.745: E/AndroidRuntime(21298): FATAL EXCEPTION: main
07-29 09:48:08.745: E/AndroidRuntime(21298): java.lang.NullPointerException
07-29 09:48:08.745: E/AndroidRuntime(21298): at com.app.ExpandedListView.onDraw(ExpandedListView.java:24)
07-29 09:48:08.745: E/AndroidRuntime(21298): at android.view.View.draw(View.java:13719)
只有一个孩子可以访问,但getCount()给我的值为38。 针对此问题的其他一些解决方案将getCount()与第一个Child的高度相乘0.但我的项目具有不同的高度。
//params.height = getCount() * (old_count > 0 ? getChildAt(0).getHeight() : 0);
这对我来说没有解决方案。如何获得ListView的真实高度?
编辑: 为了更好地理解: 我的活动中有视差效果。 ScrollView包含一个ImageView作为Header并位于ListView下方。 ImageView的滚动速度比ListView慢一点。所以我不能使用普通的ListView,因为ScrollView-Parent。
LinearLayout不是选项,因为它与TextViews的组合行为错误,并且所有TextViews最多都是2行。
答案 0 :(得分:0)
试试这个,
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int desiredWidth = MeasureSpec.makeMeasureSpec(
listView.getWidth(), MeasureSpec.UNSPECIFIED);
int desiredHeight = MeasureSpec.makeMeasureSpec(
listView.getHeight(), MeasureSpec.UNSPECIFIED);
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View view = listAdapter.getView(i, null, listView);
view.measure(desiredWidth, desiredHeight);
totalHeight += view.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}