Android 更改 RecyclerView 中的布局展示

Android change layout presentation in RecyclerView

我想将 RecyclerView 中的布局表示从列表更改为网格,反之亦然。所以我将 onCreateViewHolder 方法更改为:

if (presentation.equals("grid")) {
    return LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_grid, parent, false);
}
else {
    return LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_list, parent, false);   
}

在我的特征方法中,我在 .setLayoutManager(..) 方法中设置了不同的 LayoutManager 然后 notifyDataSetChanged();

if (presentation.equals("grid")) {
    recyclerView.setLayoutManager(new GridLayoutManager(context, 3));
}
else {
    recyclerView.setLayoutManager(new LinearLayoutManager(context));
}
adapter.notifyDataSetChanged();

但是当我使用这个功能时,有些布局来自网格布局,有些来自列表布局。

我知道 RecyclerView 重用未显示的元素,但如何保持正确显示并仍然重用元素?

onCreateViewHolder() 仅在 RecyclerView 没有足够的视图持有者并且需要您创建一个新视图持有者时调用。但它会保留一个以前创建的视图持有者池并重用它们。当您将演示文稿更改为 "grid" 时,您开始创建新的 "grid view holders",但旧的 "list view holders" 仍在池中并被重复使用。您需要一种方法让您的视图持有者不混合。我可以看到几个解决方案。

一种方法是同时更改项目视图类型。通常它用于同时显示多种视图类型(例如混合大小项目)。在您的情况下,您仍然 return 每个项目的相同视图类型,但使其取决于您的 presentation 变量,如下所示:

@Override
public int getItemViewType(int position) {
    return presentation.equals("grid") ? 0 : 1;
}

另一种方法是在布局中使用两个 RecyclerView。两者都可以使用相同的适配器。一个只创建网格视图持有者,另一个只创建列表视图持有者。然后你可以相应地显示和隐藏它们。