简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM