Comment obtenir un contexte dans un adaptateur de vue recycleur

J’essaie d’utiliser la bibliothèque picasso pour pouvoir charger l’url dans imageView, mais je ne peux pas obtenir le context pour utiliser la bibliothèque picasso correctement.

 public class FeedAdapter extends RecyclerView.Adapter { private List mDataset; // Provide a reference to the views for each data item // Complex data items may need more than one view per item, and // you provide access to all the views for a data item in a view holder public class ViewHolder extends RecyclerView.ViewHolder { // each data item is just a ssortingng in this case public TextView txtHeader; public ImageView pub_image; public ViewHolder(View v) { super(v); txtHeader = (TextView) v.findViewById(R.id.firstline); pub_image = (ImageView) v.findViewById(R.id.imageView); } } // Provide a suitable constructor (depends on the kind of dataset) public FeedAdapter(List myDataset) { mDataset = myDataset; } // Create new views (invoked by the layout manager) @Override public FeedAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.feedholder, parent, false); // set the view's size, margins, paddings and layout parameters ViewHolder vh = new ViewHolder(v); return vh; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder holder, int position) { // - get element from your dataset at this position // - replace the contents of the view with that element holder.txtHeader.setText(mDataset.get(position).getPost_text()); Picasso.with(this.context).load("http://soffr.miximages.com/java/DvpvklR.jpg").into(holder.pub_image); } // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { return mDataset.size(); } } 

Vous avez quelques options ici:

  1. Passez le Context en tant qu’argument à FeedAdapter et conservez-le en tant que champ de classe
  2. Utilisez l’dependency injection pour injecter le Context lorsque vous en avez besoin. Je suggère fortement de lire à ce sujet. Il y a un excellent outil pour ça – Dagger by Square
  3. Obtenez-le de n’importe quel object View . Dans votre cas, cela pourrait fonctionner pour vous:

    holder.pub_image.getContext()

    Comme pub_image est un ImageView .

Vous pouvez append une variable globale:

 private Context context; 

puis atsortingbuez le contexte ici:

 @Override public FeedAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) { // create a new view View v=LayoutInflater.from(parent.getContext()).inflate(R.layout.feedholder, parent, false); // set the view's size, margins, paddings and layout parameters ViewHolder vh = new ViewHolder(v); // set the Context here context = parent.getContext(); return vh; } 

Bonne codding 🙂

Vous pouvez utiliser le contexte holder.pub_image.getContext() ):

 @Override public void onBindViewHolder(ViewHolder ViewHolder, int position) { holder.txtHeader.setText(mDataset.get(position).getPost_text()); Picasso.with(holder.pub_image.getContext()).load("http://soffr.miximages.com/java/DvpvklR.jpg").into(holder.pub_image); } 

Première déclaration globale

Context mContext;

passer le contexte avec le constructeur, en le modifiant.

 public FeedAdapter(List myDataset, Context context) { mDataset = myDataset; this.mContext = context; } 

puis utilisez le mContext où vous en avez besoin

Vous pouvez utiliser comme ceci view.getContext ()

Exemple

 holder.tv_room_name.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "", Toast.LENGTH_SHORT).show(); } }); 

Créez un constructeur de FeedAdapter:

 Context context; //global public FeedAdapter(Context context) { this.context = context; } 

et en activité

 FeedAdapter obj = new FeedAdapter(this); 

Ajoutez d’abord une variable globale

 Context mContext; 

Puis changez votre constructeur à ceci

 public FeedAdapter(Context context, List myDataset) { mContext = context; mDataset = myDataset; } 

Le passe votre contexte lors de la création de l’adaptateur.

 FeedAdapter myAdapter = new FeedAdapter(this,myDataset); 

vous pouvez utiliser ceci:

 itemView.getContext() 

Réponse courte:

 Context context; @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); context = recyclerView.getContext(); } 

Explication pourquoi d’autres réponses ne sont pas bonnes:

  1. Passer Context à l’adaptateur est complètement inutile, puisque RecyclerView vous pouvez y accéder depuis l’intérieur de la classe
  2. L’obtention de Context au niveau de ViewHolder signifie que vous le faites chaque fois que vous liez ou créez un ViewHolder . Vous dupliquez les opérations.
  3. Je ne pense pas que vous ayez à vous soucier d’une fuite de mémoire. Si votre adaptateur rest en dehors de la durée de vie de votre Activity (ce qui serait bizarre), alors vous avez déjà une fuite.