繁体   English   中英

无法从ViewHolder(RecyclerView)调用适配器中的方法

[英]Unable to call method in Adapter from ViewHolder (RecyclerView)

当用户单击时,我试图从RecyclerView中删除一个项目。 但是,即使适配器中的delete方法是公共的,当尝试从MyViewHolder中的onClick调用“删除”方法时,也会收到错误“无法解析方法delete(int)”。

是什么赋予了? 它是公开的,所以我为什么不能打电话呢?

GroceryItemAdapter

public class GroceryItemAdapter extends RecyclerView.Adapter<MyViewHolder> {
    private LayoutInflater inflater;
    private Context context;

    List<MetaData> data = Collections.emptyList();

    public GroceryItemAdapter(Context context, List<MetaData> data) {
        this.context = context;
        inflater = LayoutInflater.from(context);
        this.data = data;
    }

    public void delete(int position) {
        data.remove(position);
        notifyItemRemoved(position);
    }


    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.grocery_item_row, parent, false);
        MyViewHolder holder = new MyViewHolder(view);
        Log.i("GroceryHero", "onCreateViewHolder called");

        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        MetaData current = data.get(position);
        holder.title.setText(current.title);
        holder.icon.setImageResource(current.iconid);
        Log.i("GroceryHero","onBindViewHolder called " + position);
    }

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

}

MyViewHolder:

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView title;
ImageView icon;

public MyViewHolder(View itemView) {
    super(itemView);
    Log.i("GroceryHero", "MyViewHolder called");
    title = (TextView) itemView.findViewById(R.id.grocery_text);
    icon = (ImageView) itemView.findViewById(R.id.grocery_icon);
    itemView.setOnClickListener(this);
 }

@Override
public void onClick(View v) {
    Toast.makeText(v.getContext(), "Item clicked at " + getAdapterPosition(), Toast.LENGTH_SHORT).show();
    delete(getAdapterPosition()); // ERROR: Cannot resolve method 
}
}

您正在尝试从视图持有者类调用delete 但是delete是适配器类的方法。 您可以将适配器的实例传递给onCreateViewHolder的视图持有者,并将其存储为私有字段。

GroceryItemAdapter mAdapter;
public MyViewHolder(View itemView, GroceryItemAdapter adapter) {
    mAdapter = adapter;
    ...
}

// now you can call
mAdapter.delete(getAdapterPosition());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM