RecyclerView onCreateViewHolder 返回类型与多个自定义 ViewHolder 不兼容 [英] RecyclerView onCreateViewHolder Return Type Incompatibility With Multiple Custom ViewHolders
问题描述
我正在尝试在 RecyclerView 中使用多个 ViewHolder,以便在运行时交换这些视图.我创建了两个扩展 RecyclerView.ViewHolder 的类:
I'm trying to use multiple ViewHolders in a RecyclerView in order to swap these views out at run time. I have created two classes which extend RecyclerView.ViewHolder:
MenuItemViewHolder
public class MenuItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView menuItemText;
public ImageView menuItemPhoto;
public RecyclerViewAdapter rva;
public MenuItemViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
rva = caller;
menuItemText = (TextView) itemView.findViewById(R.id.grid_text);
menuItemPhoto = (ImageView) itemView.findViewById(R.id.grid_image);
}
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "Clicked Position = " + getPosition(), Toast.LENGTH_SHORT).show();
}
}
SelectedItemViewHolder
public class SelectedItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView menuItemText;
public ImageView menuItemPhoto;
public RecyclerViewAdapter rva;
public SelectedItemViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
menuItemText = (TextView) itemView.findViewById(R.id.grid_text_full);
menuItemPhoto = (ImageView) itemView.findViewById(R.id.grid_image_full);
}
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), "Clicked Position = " + getPosition(), Toast.LENGTH_SHORT).show();
}
}
它们在我的 RecyclerViewAdapter 类的 onCreateViewHolder 函数中被调用:
They are called within my RecyclerViewAdapter class's onCreateViewHolder function:
RecyclerViewAdapter onCreateViewHolder
// Create new views (invoked by the layout manager)
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case 0:
View gridItemLayout = LayoutInflater.from(parent.getContext())
.inflate(R.layout.grid_single, parent, false);
// set the view's size, margins, paddings and layout parameters
MenuItemViewHolder vh = new MenuItemViewHolder(gridItemLayout);
case 2:
View selectedItemLayout = LayoutInflater.from(parent.getContext())
.inflate(R.layout.grid_single_full, parent, false);
// set the view's size, margins, paddings and layout parameters
SelectedItemViewHolder sivh = new SelectedItemViewHolder(selectedItemLayout);
return sivh;
}
}
当我尝试运行代码时,出现此错误:
When I try to run the code, I get this error:
错误:(48, 36) 错误:RecyclerViewAdapter 中的 onCreateViewHolder(ViewGroup,int) 无法覆盖 Adapter 中的 onCreateViewHolder(ViewGroup,int)返回类型 ViewHolder 与 MenuItemViewHolder 不兼容其中 VH 是一个类型变量:VH 扩展了类 Adapter 中声明的 ViewHolder
Error:(48, 36) error: onCreateViewHolder(ViewGroup,int) in RecyclerViewAdapter cannot override onCreateViewHolder(ViewGroup,int) in Adapter return type ViewHolder is not compatible with MenuItemViewHolder where VH is a type-variable: VH extends ViewHolder declared in class Adapter
所以,问题似乎是 onCreateViewHolder 不接受我的自定义类是从 RecyclerView.ViewHolder 继承的.我正在使用 Android Studio,所以问题可能出在那里.我很困惑,因为我认为 Java 继承可以毫无问题地处理这个问题.有人可以提出解决方案吗?
So, the issue seems to be that onCreateViewHolder doesn't accept my custom classes as being inherited from RecyclerView.ViewHolder. I'm using Android Studio, so perhaps the issue is there. I'm perplexed since I thought Java inheritance would handle this with no problems. Could someone please propose a solution?
当我将 onCreateViewHolder 的返回类型更改为只有一个 VH 的 MenuItemViewHolder 时,一切正常.但是,当我有多个可以随时交换的 VH 类时,这不起作用.
When I change the return type of onCreateViewHolder to MenuItemViewHolder with only one VH, things work fine. However, this doesn't work when I have multiple VH classes which can be swapped at any time.
推荐答案
RecyclerView.Adapter
是一个参数化的类,它接受单个 ViewHolder
类型.您的定义可能如下所示:
The RecyclerView.Adapter
is a parameterized class that takes in a single ViewHolder
type. Your definition probably looks like:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MenuItemViewHolder>
应该是:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
不要忘记对 onBindViewHolder
也有正确的定义.您还需要覆盖 getItemViewType
.
Don't forget to have the right definition for onBindViewHolder
as well. You need to override getItemViewType
as well.
这篇关于RecyclerView onCreateViewHolder 返回类型与多个自定义 ViewHolder 不兼容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!