【问题标题】:How to expand recycleview height inside viewpager2如何在viewpager2中扩展recycleview高度
【发布时间】:2021-01-11 13:46:21
【问题描述】:

我有一个包含 2 个片段的 viewpager2。两个片段都包含一个回收视图并显示 4 个项目(第一个片段)和 5 个项目(第二个片段)的列表。我遇到的问题是,我的对话框片段(具有 viewpager2)没有扩展到第二个片段的完整所需高度。因此,我无法看到第二个片段 recycleview 的每个元素,必须向下滚动才能看到最后一个元素。

如何更改对话框片段的高度以查看第二个/具有最多项目的片段的每个项目。我希望 viewpager2 的高度与包含最多项目的片段的高度相同。目前是相反的。

DialogFragment(Viewpager2 持有者)

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <View
        android:id="@+id/emptyView"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="@color/color_primary_dark"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/shop_filter_tablayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/emptyView" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/shop_filter_viewpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginBottom="24dp"
        app:layout_constraintBottom_toTopOf="@+id/btn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/shop_filter_tablayout" />

    <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:background="@color/color_shop_filter_btn_background"
        app:layout_constraintBottom_toBottomOf="parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <com.google.android.material.button.MaterialButton
                android:id="@+id/shop_filter_submit_filter"
                style="@style/Widget.MaterialComponents.Button.TextButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="8dp"
                android:text="@string/shop_filter_submit"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <com.google.android.material.button.MaterialButton
                android:id="@+id/shop_filter_dismiss_filter"
                style="@style/Widget.MaterialComponents.Button.TextButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="16dp"
                android:text="@string/shop_filter_delete"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/shop_filter_submit_filter"
                app:layout_constraintTop_toTopOf="parent" />

        </androidx.constraintlayout.widget.ConstraintLayout>
    </com.google.android.material.appbar.MaterialToolbar>

</androidx.constraintlayout.widget.ConstraintLayout>

viewpager 2 中的片段

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_shop_filter"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:listitem="@layout/shop_filter_list_item" />

    <ProgressBar
        android:id="@+id/shop_filter_progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:visibility="invisible" />

</androidx.constraintlayout.widget.ConstraintLayout>

第一个片段列表(4 项)

第二个片段列表(5 项)

【问题讨论】:

  • 尝试删除layout_marginBottom中的androidx.viewpager2.widget.ViewPager2可能有边距。
  • 不,没有改变任何东西。第二个 recyclerview 仍在滚动。
  • 这里有一些建议:stackoverflow.com/questions/58492796/… 据我所知,问题是第一个布局发生在第一个片段上,所以它适合那个大小。如果适配器中有任意数量的片段,则系统将无法知道哪个是最大的,除非对所有片段进行膨胀以进行检查。您可以尝试的另一种方法是设置适配器,将当前片段设置为(最大片段的索引)以便布局,然后在用户看到它之前将其设置回索引 0
  • offscreenPageLimit = 2 应用于我的viewpager2 为我完成了这项工作,我对第一个片段很好,因为这实际上是我想要实现的。非常感谢
  • @cactustictacs 编辑:不幸的是,offscreenPageLimit 对我来说有一个错误。它在模拟器上工作得非常好(100 个中的 100 个),但只能在我自己的移动设备(s7)上部分工作。它仅在我第一次打开 viewpager 时起作用(现在已正确设置高度)。但是在我关闭dialogfragment并再次打开后,大小又恢复到正常大小(比以前小)

标签: android kotlin android-fragments android-recyclerview android-viewpager2


【解决方案1】:

我有几个想法:

  1. 尝试“强制”更改对话框片段的高度。类似的东西:How to set DialogFragment's width and height?

  2. 尝试将 SecondFragmet 的回收器视图高度设置为我们项目的 5xheigh。

  3. 如果总是有 5 个项目,不要使用回收站视图?? ;)

如果其中任何一个可行,请给我一个信号。

【讨论】:

  • “尝试将 secondfragments recyclerview 高度设置为我们项目的 5 倍高度”到底是什么意思?第三点:我的 recyclerview 中并不总是有 5 个项目。我从我的服务,我的第一个片段中也可能有 10 个项目,而第二个片段中只有 5 个。所以我必须使用 recyclerview :)
  • 对不起,我的误解,你写了“4 个项目和 4 个项目的列表”,所以我认为这些是常量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 2014-03-29
相关资源
最近更新 更多