在GridView中嵌套的ScrollView仅占用部分空间

7

我有以下内容: 1. 协调员布局 2. 应用栏布局 (协调员布局的子元素) 3. 折叠式工具栏布局(应用栏的子元素) 4. 嵌套滚动视图(协调员的子元素)

我想NestedScrollView中放置一个网格视图,以便用户可以在整个屏幕空间上滚动。

我的问题是当前网格视图仅占用NestedScrollView的一小部分,并且在该部分内滚动,如下图所示:

enter image description here

正如您所看到的,我的网格视图高度仅限于天蓝色区域内,我希望它占据该图像下方的整个屏幕空间(即我的折叠式工具栏)。我尝试了不同的方法,但都没有成功。 我的xml文件是:

<?xml version="1.0" encoding="utf-8"?>

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:id="@+id/app_bar"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="196dp"
        android:background="#3f51b5"
        app:contentScrim="@color/colorPrimary"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll|exitUntilCollapsed">


        <ImageView
            android:id="@+id/imageview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:src="@drawable/index"
            app:layout_collapseMode="parallax" />

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
    </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <GridView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginLeft="1dp"
        android:layout_marginRight="1dp"

        android:id="@+id/gridView"
        android:verticalSpacing="1dp"
        android:horizontalSpacing="1dp"
        android:numColumns="2"
        android:stretchMode="columnWidth"/>

</android.support.v4.widget.NestedScrollView>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="right|bottom"
    android:layout_margin="@dimen/fab_margin"
    android:src="@android:drawable/ic_dialog_email" />

5个回答

15

GridView已经内置滚动功能,因此与NestedScrollView冲突。您应该使用RecyclerViewGridLayoutManager,并在NestedScrollView的位置使用appbar_scrolling_view_behavior布局行为。


谢谢您,但我对此还不熟悉,您能否给一个示例代码来解释一下? - Midhun

14

我之前也遇到了同样的问题,以下方法对我有用:

<android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:fillViewport="true">

它只解决了问题的一半 - 现在网格适合屏幕高度(视口)+应用栏高度移位。但是参数“fillViewPort”阻止您进一步扩展网格高度。 - Zon

8

确实,GridView 不兼容 NestedScrollView,正确的解决方案是使用 RecyclerView。但在这种情况下,我需要一个快速的解决方法,并找到了一种使用自定义类扩展 GridView 的解决方案:https://gist.github.com/jiahuang/2591977

然后您只需使用自定义类替换 GridView,并像 Apoorv 的答案中设置 NestedScrollView 参数即可:

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:fillViewport="true">

3

Apoorv Singh的回答对我有所帮助,但不是完全的。你可以将GridView放在NestedScrollView中,但只有第一行会显示出来。你需要在NestedScrollView定义中添加android:fillViewport="true"以便所有内容都能正确显示。

但是,当我向下滚动时,它无法滚动到屏幕底部。我有一个具有10行的网格,有多行未显示在屏幕上,但现在我无法向下滚动以查看它们。

答案: 对我来说,这个方法现在可行了。使用GridLayoutManager的RecyclerView代替GridView。因为RecyclerView也兼容Collapsing Toolbar。当您在NestedScrollView中使用RecyclerView时,它可以正常工作。一切大小都正确,并且可以正确滚动。


我正在更正Apoorv的答案。而且我确实回答了他的问题……他的问题是当前gridview仅占用NestedScrollView的一小部分空间,并在该部分内滚动。他想知道如何解决这个问题。Apoorv的答案只有部分正确。我的答案现在,经过测试,似乎完全正确。它不仅可以帮助他解决大小问题,还可以让您正确地滚动。 - avb222
是的,使用Apoorv的答案,它没有完全滚动。使用GridLayoutManager的RecyclerView而不是GridView确实可以让您完全滚动。如果有帮助,我从答案中删除了“任何想法”部分。 - avb222

0

在NestedScrollView中添加这一行代码。
android:fillViewport="true"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接