当前位置: 首页 > 知识库问答 >
问题:

自定义 RecyclerView 适配器不允许 onBindViewHolder 使用预定义的 ViewHolder

方俊
2023-03-14

我是android开发的新手,我正在尝试创建一个自定义的适配器,为RecyclerView提供一个只包含一个图像和一个文本视图的视图。

但是,我试图为onBindViewHolder(VH,int)定义一个简单的扩展ViewHolder,而Android studio根本不会采用自定义ViewHolder,'MyViewHolder' - 说“该方法不会覆盖其超类中的方法。

如果我把参数变成一个普通的RecyclerView.ViewHolder就可以了……但是我需要在MyViewHolder中添加额外的变量。

最后,根据N.T.的建议,我尝试修改类的“extends”声明,但没有任何效果。

请,任何帮助将是巨大的!

public class ProductAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private ArrayList CategoryNames;
private ArrayList CategoryImages;
private Context Context;

public ProductAdapter(Context context, ArrayList categoryNames, ArrayList categoryImages){
    this.Context = context;
    this.CategoryNames = categoryImages;
    this.CategoryImages = categoryImages;
}

private class MyViewHolder extends RecyclerView.ViewHolder {
    // initialise the item view's
    TextView name;
    ImageView image;

    private MyViewHolder(View itemView) {
        super(itemView);
        // get the reference of item view's
        name = (TextView) itemView.findViewById(R.id.name);
        image = (ImageView) itemView.findViewById(R.id.image);
    }
}

@Override
public int getItemCount() {
    return CategoryNames.size();
}

@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
    // set the data in items
    holder.name.setText(CategoryNames.get(position).toString());
    holder.image.setImageResource(CategoryImages.get(position));
    // implement setOnClickListener event on item view.
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // display a toast with person name on item click
            Toast.makeText(Context, CategoryNames.get(position).toString(),
                    Toast.LENGTH_SHORT).show();
        }
    });
}



@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    // infalte the item Layout
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_product, parent, false);
    // set the view's size, margins, paddings and layout parameters
    MyViewHolder vh = new MyViewHolder(v); // pass the view to View Holder
    return vh;
}
}

共有2个答案

郑锦
2023-03-14

你可以这样写

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.MyViewHolder> {

   private ArrayList CategoryNames;
   private ArrayList CategoryImages;
   private Context Context;

   public ProductAdapter(Context context, ArrayList categoryNames, ArrayList categoryImages){
         this.Context = context;
         this.CategoryNames = categoryImages;
         this.CategoryImages = categoryImages;
   }

   private class MyViewHolder extends RecyclerView.ViewHolder {

       // initialise the item view's
       TextView name;
       ImageView image;

       private MyViewHolder(View itemView) {

           super(itemView);
           // get the reference of item view's
           name = (TextView) itemView.findViewById(R.id.name);
           image = (ImageView) itemView.findViewById(R.id.image);
       }

    }

    @Override
    public int getItemCount() {

        return CategoryNames.size();

    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position){
         // set the data in items
         holder.name.setText(CategoryNames.get(position).toString());
         holder.image.setImageResource(CategoryImages.get(position));
        // implement setOnClickListener event on item view.
        holder.itemView.setOnClickListener(new View.OnClickListener() {

             @Override
             public void onClick(View view) {
                  // display a toast with person name on item click
                  Toast.makeText(Context, CategoryNames.get(position).toString(),
                  Toast.LENGTH_SHORT).show();
              }
        });
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
       // infalte the item Layout
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_product, parent, false);
      // set the view's size, margins, paddings and layout parameters
       MyViewHolder vh = new MyViewHolder(v); // pass the view to View Holder
       return vh;
     }
}
郭元明
2023-03-14

改变

public class ProductAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolderr> {

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.MyViewHolder>

现在可以了

 类似资料:
  • 英文原文:http://emberjs.com/guides/models/customizing-adapters/ 在Ember Data中,处理与后台数据仓库通信的逻辑是通过Adapter来完成的。Ember Data适配器内置了一些关于REST API的假定。如果后台的实现与Ember Data假定的惯例不同,那么通过扩展缺省的适配器可能很容易的实现。 有时因为一些原因需要自定义适配器,例

  • Ember.js适配器指定如何在后端数据存储中保存数据,例如URL格式和REST API标头。 默认的Ember适配器包含一些REST API的内置假设。 这些假设有助于更轻松,更好地构建Web应用程序。 可以使用以下命令创建适配器 - ember generate adapter adapter-name 运行上面的命令时,它将显示以下行 - import DS from 'ember-dat

  • 我需要使用 restlet 客户端放置以下 rest 请求: 我可以在一个单独的调用中获取XToken,但是在当前的调用中,我无法在我的ClientResource对象中设置“Authorization”头。 有人可以建议我需要为我拥有的以下代码行添加哪些代码: 在restlet中创建和添加“Authorization”标头会导致restlet客户端库中出现错误。 提前谢谢 阿希什·夏尔马

  • 主要内容:创建自定义适配器,注册自定义适配器,使用适配器Gson使用其内置适配器执行对象的序列化/反序列化。 它也支持自定义适配器。 让我们来讨论如何创建一个自定义适配器以及如何使用它。 创建自定义适配器 通过扩展类并传递目标类型的对象来创建自定义适配器。 重写读写方法分别执行自定义的反序列化和序列化。 注册自定义适配器 使用注册自定义适配器并使用创建一个Gson实例。参考以下实现代码 - 使用适配器 Gson现在将使用自定义适配器将Json文本转换为

  • 我使用一个API,它以数组的形式返回数据,比如这个JSON字符串(我们称之为“任务”) 我想将这个响应解析为一个列表。所以我已经用生成的适配器创建了相应的数据类 我的改装服务是这样的 但我想使用容器类型,例如: 作为网络响应结果。这可能不创建自定义adpter或者我将需要创建一个自定义适配器并将其传递给moshi构建器吗?

  • 问题内容: 这是我遵循的使用自定义Listview适配器的教程。我遇到的问题是,当我尝试清除适配器时,应用程序崩溃并抛出 更新的代码: 问题答案: 环顾四周,似乎是使用数组初始化适配器。请参阅带有ArrayAdapter.remove的UnsupportedOperationException和无法在ListView中修改ArrayAdapter:UnsupportedOperationExcep