我正在尝试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将创建新视图,并且不会回收已经创建的视图?
答案 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
类型