【发布时间】: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