web-dev-qa-db-fra.com

Comment obtenir un contexte dans un adaptateur de vue de recycleur

J'essaie d'utiliser la bibliothèque picasso pour pouvoir charger l'URL dans imageView, mais je ne parviens pas à obtenir la variable context pour utiliser la bibliothèque picasso correctement.

public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.ViewHolder> {
    private List<Post> 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 string 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<Post> 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://i.imgur.com/DvpvklR.png").into(holder.pub_image);


    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDataset.size();
    }

}
99
Stranger B.

Vous pouvez ajouter une variable globale:

private Context context;

puis assigner le contexte à partir d'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 :) 

22
Farhad ArcxX

Vous pouvez utiliser le contexte pub_image (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://i.imgur.com/DvpvklR.png").into(holder.pub_image);


}
14
Ahmad Aghazadeh

Réponse courte:

Context context;

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

Explication pourquoi les autres réponses ne sont pas géniales:

  1. Le passage de Context à l'adaptateur est totalement inutile, puisque RecyclerView vous pouvez y accéder depuis la classe.
  2. L'obtention de Context au ViewHolder signifie que vous le faites chaque fois que vous liez ou créez un ViewHolder. Vous dupliquez des opérations.
  3. Je ne pense pas que vous ayez à vous soucier d'une fuite de mémoire. Si votre adaptateur reste en dehors de votre durée de vie Activity (ce qui serait étrange), vous avez déjà une fuite.
7
taurelas

D'abord déclarer globalement 

Context mContext; 

passer le contexte avec le constructeur, en le modifiant.

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

puis utilisez la mContext partout où vous en avez besoin

5
Blue_Alien

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


        }
    });
4
Arpit Patel

Créez un constructeur de FeedAdapter:

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

et en activité 

FeedAdapter obj = new FeedAdapter(this);
4
blockwala

vous pouvez utiliser ceci:

itemView.getContext()
2
张家宝

Ajoutez d'abord une variable globale

Context mContext;

Puis changez votre constructeur en ceci

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

Passez votre contexte lors de la création de l'adaptateur.

FeedAdapter myAdapter = new FeedAdapter(this,myDataset);
2
AKT

Vous pouvez définir:

Context ctx; 

Et sur onCreate initialiser ctx à: 

ctx=parent.getContext(); 

Remarque: le parent est un groupe de vues.

0
Marcos vitouley