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

BAr*_*ell 6 java android android-layout android-view android-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();
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码无法完全正确地工作。当我打电话给setModeEnabled(true)一些显示layout_first_mode_item布局的项目时。

如何实现呢?

azi*_*ian 5

onCreateViewHolder()如果ViewHolder已创建ViewHolder的池中没有,则将调用。在此回调中,您可以指定要RecyclerView创建的视图。

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

getItemViewType()根据您的用例覆盖并返回布局ID:

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

ViewHolder为这两种布局创建2个类,并根据回调的参数从onCreateViewHolder()适当的返回值创建。ViewHolderviewTypeonCreateViewHolder()

@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
}
Run Code Online (Sandbox Code Playgroud)

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