Android 获取具有不同项目布局的ListView的高度
我想测量Android 获取具有不同项目布局的ListView的高度,android,listview,height,Android,Listview,Height,我想测量列表视图的高度,并在加载一些数据后将其展开。ListAdapter根据数据类型为项目选择不同的布局 我尝试了以下代码: public class ExpandedListView extends ListView { [...] @Override protected void onDraw(Canvas canvas) { if (getCount() != 0) { params = getLayoutParams(); int heigh
列表视图的高度,并在加载一些数据后将其展开。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);
}
[...]
只有一个子级是可访问的,但是getCount()给我的值是38。
此问题的其他一些解决方案将getCount()与第一个子项的高度相乘为0。但是我的东西有不同的高度
//params.height = getCount() * (old_count > 0 ? getChildAt(0).getHeight() : 0);
这对我来说不是解决办法。如何获取ListView的真实高度
编辑:
为了更好地理解:
我的活动中有视差效应。ScrollView包含一个ImageView作为标题,在ListView下面。ImageView的滚动速度比ListView慢一点。因此,由于ScrollView父级的原因,我无法使用普通的ListView。
LinearLayout没有选项,因为它与TextView组合时的行为是错误的,并且所有TextView最多有两行高。试试这个
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);
}
public static void setListViewHeightBasedOnChildren(ListView ListView){
ListAdapter ListAdapter=listView.getAdapter();
如果(listAdapter==null){
返回;
}
int desiredWidth=MeasureSpec.makeMeasureSpec(
getWidth(),MeasureSpec.UNSPECIFIED);
int desiredHeight=MeasureSpec.makeMeasureSpec(
listView.getHeight(),度量值未指定);
int totalHeight=0;
对于(int i=0;i
也许这会对您有所帮助。您的链接似乎就是我上面提到的解决方案=(它只将getCount()与第一个孩子的高度相乘。但是我的第一个孩子不是最高的。所以它不够高。好吧,我想我理解你的问题。这个解决方案怎么样?:listviewElementsheight
变量根据实际大小保存所有项目的高度private int GetTotalItemHight(){ListAdapter adapter=(ListAdapter)getAdapter();int listviewElementsheight=0;for(int i=0;i
不工作,因为mView.measure()处存在NullPointerException;这意味着您将无法在onDraw方法中获取所有列表项,因为这些项尚未在内存中
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);
}