使 StaggeredGridLayout 包装内容
Making StaggeredGridLayout wrap content
我需要在线性布局中显示交错网格。
为此,我在 android.support.v7.widget
的 RecyclerView
上使用了 StaggeredGridLayoutManager
。问题是 StaggeredGridLayoutManager
不支持 wrap_content
.
还有其他问题解决这个问题,但它们与线性布局有关,而不是交错网格:
- How do I make WRAP_CONTENT work on a RecyclerView
据我所知,我可以推导出 StaggeredGridLayoutManager
并实现 onMeasure
。有没有办法在不重新计算 children 我自己的位置和大小的情况下做到这一点?查看 StaggeredGridLayoutManager.java source 时,我可以看到它使用 ScrollbarHelper
来近似滚动内容的大小。有没有办法重用它?
我最终为此使用了自定义控件,灵感来自:
https://github.com/expilu/AntipodalWall/blob/master/library/src/com/antipodalwall/AntipodalWallLayout.java
问题是当RecyclerView被绘制时,它会在绘制下一个元素之前计算所有剩余的大小给自己,并且在绘制其他元素之后不重新计算,将它们留在屏幕之外。
这个问题有一个简单的解决方法:诀窍是先绘制所有其他元素,最后留下 RecyclerView。使用相对布局并将 RecyclerView 放在 XML 布局文件的最后。由于使用相对布局,您可以将每个元素独立于 XML 文件中的顺序放置在任意位置,因此您将在 RecyclerView 之前绘制所有元素,这将使它计算出准确的剩余 space 和 wrap_content 将正常工作。
在 RecyclerView 下方添加分页栏的示例:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity"
>
<LinearLayout
android:id="@+id/pagination_btns"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentBottom="true"> //HERE YOU ALIGN THIS ELEMENT TO THE BOTTOM OF THE PARENT
<Button
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/previous_btn_label"/>
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/next_btn_label"/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/items_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:layout_above="@id/pagination_btns"/> //HERE YOU ALIGN THE RECYCLERVIEW ABOVE THE PAGINATION BAR
</RelativeLayout>
我需要在线性布局中显示交错网格。
为此,我在 android.support.v7.widget
的 RecyclerView
上使用了 StaggeredGridLayoutManager
。问题是 StaggeredGridLayoutManager
不支持 wrap_content
.
还有其他问题解决这个问题,但它们与线性布局有关,而不是交错网格:
- How do I make WRAP_CONTENT work on a RecyclerView
据我所知,我可以推导出 StaggeredGridLayoutManager
并实现 onMeasure
。有没有办法在不重新计算 children 我自己的位置和大小的情况下做到这一点?查看 StaggeredGridLayoutManager.java source 时,我可以看到它使用 ScrollbarHelper
来近似滚动内容的大小。有没有办法重用它?
我最终为此使用了自定义控件,灵感来自: https://github.com/expilu/AntipodalWall/blob/master/library/src/com/antipodalwall/AntipodalWallLayout.java
问题是当RecyclerView被绘制时,它会在绘制下一个元素之前计算所有剩余的大小给自己,并且在绘制其他元素之后不重新计算,将它们留在屏幕之外。
这个问题有一个简单的解决方法:诀窍是先绘制所有其他元素,最后留下 RecyclerView。使用相对布局并将 RecyclerView 放在 XML 布局文件的最后。由于使用相对布局,您可以将每个元素独立于 XML 文件中的顺序放置在任意位置,因此您将在 RecyclerView 之前绘制所有元素,这将使它计算出准确的剩余 space 和 wrap_content 将正常工作。
在 RecyclerView 下方添加分页栏的示例:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity"
>
<LinearLayout
android:id="@+id/pagination_btns"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_alignParentBottom="true"> //HERE YOU ALIGN THIS ELEMENT TO THE BOTTOM OF THE PARENT
<Button
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/previous_btn_label"/>
<Space
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<Button
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@string/next_btn_label"/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/items_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical"
android:layout_above="@id/pagination_btns"/> //HERE YOU ALIGN THE RECYCLERVIEW ABOVE THE PAGINATION BAR
</RelativeLayout>