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

Xar*_*iss 1 java android

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

是什么赋予了?它是公开的,为什么我不能调用它?

杂货适配器

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

}
Run Code Online (Sandbox Code Playgroud)

我的视图持有人:

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 
}
}
Run Code Online (Sandbox Code Playgroud)

Ama*_*osh 6

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

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

// now you can call
mAdapter.delete(getAdapterPosition());
Run Code Online (Sandbox Code Playgroud)

  • 嗨,将适配器传递给观察者是一种好习惯吗?@阿玛戈什 (3认同)
  • @Rat-a-tat-a-tatRatatouille 想不出任何问题;另一种选择是将视图持有者声明为内部类,它无论如何都会创建一个隐式引用。 (2认同)