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
。两者都可以使用相同的适配器。一个只创建网格视图持有者,另一个只创建列表视图持有者。然后你可以相应地显示和隐藏它们。
我想将 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
。两者都可以使用相同的适配器。一个只创建网格视图持有者,另一个只创建列表视图持有者。然后你可以相应地显示和隐藏它们。