2017-07-27 24 views
0

ユーザーがクリックするとRecyclerViewから項目を削除しようとしています。ただし、アダプタのdeleteメソッドがpublicであっても、MyViewHolderのonClickから '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

Thanks Sam!クラスを動かすことはやりました。 – Xarsiss

答えて

1

あなたは、ビューのホルダークラスから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とサミュエル。私はそれを解決する内部クラスとして移動していなかった。私は両方のソリューションを見ることができてうれしいです。 – Xarsiss

関連する問題