RecyclerView onCreateViewHolder 返回类型与多个自定义 ViewHolder 不兼容 [英] RecyclerView onCreateViewHolder Return Type Incompatibility With Multiple Custom ViewHolders

本文介绍了RecyclerView onCreateViewHolder 返回类型与多个自定义 ViewHolder 不兼容的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆