簡體   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