2017-07-27 108 views
0

我試圖在用戶點擊它時從我的RecyclerView刪除一個項目。但是,即使Adapter中的delete方法是public,當試圖從MyViewHolder中的onClick調用'delete'方法時,出現錯誤「無法解析方法delete(int)」。無法從ViewHolder調用適配器中的方法(RecyclerView)

什麼給?它是公開的,爲什麼我不能稱它?

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 
} 
} 
+0

您的MyViewHolder是recyclerview的內部類嗎? –

+0

將您的MyViewHolder類移入GroceryItemAdapter的內部類 –

+0

謝謝Sam!移動課程的確有竅門。 – Xarsiss

回答

1

你試圖調用從視圖holder類delete。但delete是適配器類的一種方法。您可以將適配器實例傳遞給onCreateViewHolder中的視圖持有者,並將其存儲爲專用字段。

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

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

這樣做感謝Amarghosh!我使用'MyViewHolder holder = new MyViewHolder(view,this)'將適配器實例傳遞給視圖持有者;'然後可以使用mAdapter.delete完成刪除操作。獎勵! – Xarsiss

+0

@ Xarsiss Samuel的建議也可以。你可以從內部類訪問一個類的成員。所以如果你不介意讓視圖持有者成爲適配器的內部類,那應該可以工作。 – Amarghosh

+0

完美,謝謝Amarghosh和Samuel。我沒有把它作爲內部課程來解決它。我很高興我能看到這兩種解決方案。 – Xarsiss

相關問題