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

时间:2017-07-27 07:56:44

标签: java android

我对Android开发很新,我正在尝试创建一个自定义adpater来为RecyclerView提供一个只包含图像和textview的视图。

然而,我正在尝试为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 个答案:

答案 0 :(得分:2)

更改

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

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

现在可以使用

答案 1 :(得分:0)

你可以像这样写

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;
     }
}