如何更改 RecyclerView 中所有项目的布局?

How to change layout for all items in RecyclerView?

我有一个 RecyclerView。在适配器中,我有一个布尔标志来确定哪个布局应该用于所有项目:

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();
    }
}

这段代码并不完全正确。当我调用 setModeEnabled(true) 时,某些项目显示为 layout_first_mode_item 布局。

如何实现?

当已创建的 ViewHolder 池中没有 ViewHolder 时,将调用

onCreateViewHolder()。在此回调中,您指定希望 RecyclerView 为您创建的视图。

onCreateViewHolder()不一定会在你执行完notifyDataSetChanged()之后调用。相反 onBindViewHolder() 将被触发。这是您应该更新视图的地方。

根据您的用例覆盖 getItemViewType() 和 return 布局 ID:

@Override
public int getItemViewType(final int position) {
    return mIsSecondModeEnabled ? R.layout.my_layout_1 : R.layout.my_layout_2;
}

为这两个布局创建 2 ViewHolder 类 并从 onCreateViewHolder() return 适当 ViewHolder 取决于 viewType 参数 onCreateViewHolder()回调。

@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
}

然后在 onBindViewHolder() 回调中设置您的视图。