【问题标题】:Custom RecyclerView adapter won't allow onBindViewHolder to use pre-defined ViewHolder自定义 RecyclerView 适配器不允许 onBindViewHolder 使用预定义的 ViewHolder
【发布时间】:2017-07-27 07:56:43
【问题描述】:

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

但是,我正在尝试为 onBindViewHolder(VH, int) 定义一个简单的扩展 ViewHolder,而 android studio 根本不会采用自定义 ViewHolder,'MyViewHolder' - 说 “该方法不会覆盖来自它的超类。”

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

最后,按照N.T. 的建议,我尝试更改类的“扩展”声明,但没有任何效果。

拜托,任何帮助都会很棒!

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

【问题讨论】:

    标签: java android


    【解决方案1】:

    改变

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

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

    现在可以使用了

    【讨论】:

    • 另外,将MyViewHolder 的访问修饰符从private 更改为public
    【解决方案2】:

    你可以这样写

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

    【讨论】:

    • 谢谢!现在工作得很好。
    猜你喜欢
    • 2018-06-11
    • 2016-04-08
    • 2015-08-22
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多