与 Flipboard 应用程序布局相同的两个回收器视图

Two recycler view in same layout as in flipboard app

我想在另一个 RecyclerView(类似网格)下方使用一个 RecyclerView(类似列表),如 flipboard

我在 ScrollView 中尝试了两个 RecyclerView,但没有显示内容。

如果将其放置在线性布局中并为其添加相同的权重,我可以看到两个视图。但这看起来不像这个应用程序视图。

这是我的布局

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:orientation="vertical">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/parent_category_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minWidth="@dimen/default_small_padding"
        android:gravity="center"
        android:visibility="visible"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/category_grid"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:columnWidth="150dp"
        android:gravity="center"
        android:visibility="visible"/>

</LinearLayout>

在 android 中,我们建议您一次只使用一个可滚动视图,如果您想在另一个可滚动视图中使用一个可滚动视图,请参考以下链接。

1)Android list view inside a scroll view

2)

我不认为他们使用两个 ListView(或 ListView + GridView)。

我认为他们使用 ListView(底部的那个)并且他们向这个列表(顶部的那个)添加了自定义的 Header,这看起来像 GridView.

或者,如果他们使用 Recyclerview,他们可以通过在第一个项目的适配器中使用不同的布局来实现这一点。

PS: 不建议在彼此内部使用两个可滚动视图(如 RecyclerviewScrollView 内部)。

实际上有一种非常简单的方法,只需一个 RecyclerView

即可实现所需的布局

密钥正在使用 GridLayoutManager 及其 SpanSizeLookup。 首先像这样定义你的 GridLayoutManager:

GridLayoutManager layoutManager = new GridLayoutManager(context, spanCount);

其中 spanCount 是您想要的 spans/columns 的最大数量。在你的情况下,spanCount 应该是 2;

现在您需要一种方法来告诉这个 layoutManager 一个项目应该跨越多少个跨度。 一种简单的方法是对应该只跨越一列的项目使用 viewtype/ViewHolder,对跨越整个宽度的项目使用另一个。

假设您将网格项的视图类型定义为 VIEWTYPE_GRID_ITEM,将标准列表项的视图类型定义为 VIEWTYPE_LIST_ITEM。 然后,您可以使用这些视图类型来告诉布局管理器何时只使用一个跨度:

layoutManager.setSpanSizeLookup(new SpanSizeLookup() {
    @Override
    public int getSpanSize(int position){
        return adapter.getItemViewType(position) == VIEWTYPE_GRID_ITEM ? 1 : spanCount;
    }
});

最后,将 layoutManager 设置为您的 RecyclerView:

recyclerView.setLayoutManager(layoutManager);

就是这样!