RecyclerView在getItemViewType方法中返回的位置,因此可以在onCreateViewHolder中使用

时间:2018-12-14 18:36:15

标签: android android-recyclerview recycler-adapter

我正在尝试ReyclerView,并且试图创建一个适配器,以便可以在整个应用程序中使用它。这是我的适配器:

public class RecyclerViewAdapter extends BaseRecyclerAdapter<ItemView, RecyclerView.ViewHolder> {

    public RecyclerViewAdapter(Context context) {
        super(context, new ArrayList<ItemView>());
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int position) {
        int viewType = getItem(position).getLayoutId();
        View view = LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false);
        return getItem(position).getViewHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        getItem(position).bindViews();
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }
}

BaseRecyclerAdapter是用于保存项目的标准适配器,并具有用于添加,删除...的标准功能。

ItemView看起来像这样:

public abstract class ItemView {
    public abstract int getLayoutId();

    public abstract RecyclerView.ViewHolder getViewHolder(View view);

    public abstract void bindViews();
}

现在我可以创建扩展ItemView的项目,并且可以将此适配器与其他项目一起使用。

问题是,在这种情况下,在getItemViewType中返回位置是否安全?还是recyclerView将创建新视图,并且不会回收已经创建的视图?

1 个答案:

答案 0 :(得分:0)

  

问题是,在这种情况下,在getItemViewType中返回位置是否安全?还是recyclerView将创建新视图,并且不会回收已经创建的视图?

否,从getItemViewType()返回头寸并不安全,您的怀疑是正确的:由于View类型指示是否可以将现有View回收用于新的数据项需要相同的View类型,而每个数据项都具有唯一的View类型的方法将完全防止View的回收。

documentation for getItemViewType()中,它说

  

考虑使用id资源来唯一标识项目视图类型

也许这对您来说是个好主意:您在onCreateViewHolder()中已经有了这一行

  

int viewType = getItem(position).getLayoutId();

因此您可以将其移至getItemViewType()

@Override
public int getItemViewType(int position) {
    return getItem(position).getLayoutId();
}

onCreateViewHolder()看起来像这样

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewTypeResourceId) {
    View view = LayoutInflater.from(parent.getContext()).inflate(viewTypeResourceId, parent, false);
    return getItem(viewTypeResourceId).getViewHolder(view);
}

请注意,我将getItem()的参数从 position 更改为 viewTypeResourceId ,因为您在{{ 1}}。有一些松散的结局,但我认为您的方法仍然可行,您只需要提供位置到布局资源ID的映射,以及布局资源ID(即视图类型)到特定类型的ViewHolder的映射(而且您可以始终通过调用onBindViewHolder()来获得给定位置的View类型