[英]How to change layout for all items in RecyclerView?
I have a RecyclerView. 我有一个RecyclerView。 In adapter I have a boolean flag to determine which of layout should be used for all items:
在适配器中,我有一个布尔标志来确定应该为所有项使用哪个布局:
public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
private boolean mIsSecondModeEnabled;
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(mIsSecondModeEnabled ?
R.layout.layout_second_mode_item :
R.layout.layout_first_mode_item, parent, false);
return new MyHolder(view);
}
public void setModeEnabled(boolean enabled) {
mIsSecondModeEnabled = enabled;
notifyDataSetChanged();
}
}
This code doesn't work completely right. 此代码不能完全正常工作。 When I call
setModeEnabled(true)
some items showing with layout_first_mode_item
layout. 当我调用
setModeEnabled(true)
一些项目显示layout_first_mode_item
布局。
How to achieve it? 怎么实现呢?
onCreateViewHolder()
will be called, when there are no ViewHolder
s in the pool of already created ViewHolder
s. 当已创建的
ViewHolder
池中没有ViewHolder
时,将调用onCreateViewHolder()
。 In this callback you specify what view you want RecyclerView
to create for you. 在此回调中,您可以指定
RecyclerView
为您创建的视图。
onCreateViewHolder()
will not necessarily be called after you have performed notifyDataSetChanged()
. 执行
notifyDataSetChanged()
后,不一定会调用onCreateViewHolder()
notifyDataSetChanged()
。 Instead onBindViewHolder()
will be triggered. 而是触发
onBindViewHolder()
。 This is the place where you should update your view. 这是您应该更新视图的地方。
Override getItemViewType()
and return the layout id depending on your use case: 覆盖
getItemViewType()
并根据您的用例返回布局ID:
@Override
public int getItemViewType(final int position) {
return mIsSecondModeEnabled ? R.layout.my_layout_1 : R.layout.my_layout_2;
}
Create 2 ViewHolder
classes for those two layouts and from onCreateViewHolder()
return appropriate ViewHolder
depending on the viewType
parameter of onCreateViewHolder()
callback. 为这两个布局创建2个
ViewHolder
类,并从onCreateViewHolder()
返回适当的ViewHolder
具体取决于onCreateViewHolder()
回调的viewType
参数。
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == R.layout.my_layout_1) {
// create FirstViewHolder
} else if (viewType == R.layout.my_layout_2) {
// create SecondViewHolder
}
// return created ViewHolder
}
Then in onBindViewHolder()
callback setup your views. 然后在
onBindViewHolder()
回调中设置你的视图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.