当内容改变时调整 scrollView 的大小

resizing scrollView when its content changes

我的布局如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:orientation="vertical">

    <eddine.charef.mechalikh.swipedemo.NotifyingScrollView
    android:id="@+id/scroll_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
        android:layout_marginTop="-40dp"
        android:fillViewport="false">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/image_header"
            android:layout_width="match_parent"
            android:layout_height="250dp"
            android:src="@drawable/stethoscope"
            android:scaleType="centerCrop" />
        <View
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/view"
            android:background="@drawable/gradient"/>
        <View
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/view2"
            android:layout_above="@+id/linearLay"
            android:background="@drawable/gradient2"
            android:visibility="gone" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_marginTop="-10dp"
            android:layout_below="@+id/image_header"
            android:id="@+id/linearLay"
            android:animateLayoutChanges="true"
            android:background="#ffffff"
            android:layout_alignTop="@+id/editPrenom">

            <Space
                android:layout_width="fill_parent"
                android:layout_height="22dp"
                android:id="@+id/space_spinner"
                android:visibility="gone" />

            <Spinner
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:id="@+id/spinner3"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true"
                android:visibility="gone"
                android:gravity="center" />

        </LinearLayout>


        <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/listView5"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_below="@+id/linearLay"
            android:visibility="visible" />


        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="@string/bienvenue"
            android:id="@+id/textView20"
            android:textColor="#000"
            android:layout_centerHorizontal="true"
            android:layout_below="@+id/view"
            android:visibility="visible"
            android:layout_marginTop="20dp"
            android:gravity="left"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:id="@+id/textView21"
            android:textColor="#000"
            android:layout_below="@id/textView20"
            android:layout_centerHorizontal="true"
            android:visibility="visible"
            android:gravity="left"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp" />
        <ImageView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:id="@+id/imageView5"
            android:layout_below="@+id/linearLay"
            android:src="@drawable/shadow_divider"
            android:layout_marginTop="-3dp" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageView2"
            android:adjustViewBounds="true"
            android:src="@drawable/param"
            android:onClick="params_click"
            android:visibility="visible"
            android:layout_above="@+id/linearLay"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="15dp"
            android:layout_marginBottom="-25dp"
            android:scaleType="center" />

    </RelativeLayout>
</eddine.charef.mechalikh.swipedemo.NotifyingScrollView>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/image_scroll_up_2"
        android:adjustViewBounds="true"
        android:src="@drawable/scroll_up"
        android:onClick="scroll_up"
        android:visibility="invisible"
        android:layout_above="@+id/space"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginRight="15dp" />

    <Space
        android:layout_width="fill_parent"
        android:layout_height="15dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/space" />
</RelativeLayout>

在运行时 scrollView 内的 listView 将被更新... 当用户点击 "date" 时,它显示一切正常(没问题) 当他单击 "followed" 时,即使 listview 为空并且滚动视图正常(没问题,无法滚动,因为列表为空) but when selecting "messages" , when the list is empty or just few items ...the scroll view can scroll (i mean a lot of space see the picture)

这张图片中间的白色圆盘是设置中开发者选项的触点,它不是我布局的一部分

您可以在图二中看到列表结束的位置(listView 的背景与 scrollView 的背景不同)

那么为什么 scrollView 不会调整大小?

注意:我使用这个函数来调整listView的大小,所以它会显示在scrollView中

           ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
        // pre-condition
              return;
        }

        int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
        for (int i = 0; i < listAdapter.getCount(); i++) {
             View listItem = listAdapter.getView(i, null, listView);
             if (listItem instanceof ViewGroup) {
                listItem.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
             }
             listItem.measure(0, 0);
             totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
                  listView.setLayoutParams(params);
    }

我在项目发生变化的任何地方都调用它。

我不明白为什么要将 scollview 放在 listview 中,您是否尝试过执行视差或玩工具栏?

要玩视差或工具栏,使用 RecyclerView 更简单。 您可以使用 ObservableRecyclerView 提供大量示例:

https://github.com/ksoichiro/Android-ObservableScrollView