gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:10:51 34 4
gpt4 key购买 nike

我正在试验 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 会创建新的 View 而不回收已经创建的 View ?

最佳答案

The question is, is it safe to return position in getItemViewType in this case? Or the recyclerView will create new views and will not recycle already created?

不,从 getItemViewType() 返回位置并不“安全”,您的怀疑是正确的:因为 View 类型表明是否有一个现有的 View 可以为需要相同 View 类型的新数据项回收,每个项目都有其唯一的 View 类型的方法将完全阻止回收查看

documentation for getItemViewType() , 它说

Consider using id resources to uniquely identify item view types

也许这对你来说是个好主意:你已经在 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 因为您只有一个 positiononBindViewHolder() 中。有一些 Unresolved 问题,但我认为您的方法仍然可行,您只需要提供位置到布局资源 ID 的映射以及布局资源 ID(也称为 View 类型)到特定类型 ViewHolder 的映射(并且您始终可以通过调用 getItemViewType() 获取给定位置的 View 类型)

关于android - RecyclerView 在 getItemViewType 方法中返回位置,因此它可以在 onCreateViewHolder 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53785185/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com