Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 获取具有不同项目布局的ListView的高度_Android_Listview_Height - Fatal编程技术网

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);
}