java - adding - Cómo obtener un contexto en un adaptador de vista de reciclador
picasso get() load (10)
Cree un constructor de FeedAdapter:
Context context; //global
public FeedAdapter(Context context)
{
this.context = context;
}
y en actividad
FeedAdapter obj = new FeedAdapter(this);
Estoy tratando de usar la biblioteca picasso para poder cargar la url en imageView, pero no puedo obtener el
context
para usar la biblioteca picasso correctamente.
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();
}
}
Primero agregue una variable global
Context mContext;
Luego cambia tu constructor a esto
public FeedAdapter(Context context, List<Post> myDataset) {
mContext = context;
mDataset = myDataset;
}
Pasan su contexto al crear el adaptador.
FeedAdapter myAdapter = new FeedAdapter(this,myDataset);
Primero declarar globalmente
Context mContext;
pasar contexto con el constructor, modificándolo.
public FeedAdapter(List<Post> myDataset, Context context) {
mDataset = myDataset;
this.mContext = context;
}
luego use el
mContext
donde lo necesite
Puede agregar una variable global:
private Context context;
luego asigne el contexto desde aquí:
@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;
}
Happy Codding :)
Puede usar así view.getContext ()
Ejemplo
holder.tv_room_name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "", Toast.LENGTH_SHORT).show();
}
});
Puede usar el contexto
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);
}
Puedes definir:
Context ctx;
Y en
onCreate
initialize
ctx
para:
ctx=parent.getContext();
Nota: Parent es un ViewGroup.
Respuesta corta:
Context context;
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
context = recyclerView.getContext();
}
Explicación de por qué otras respuestas no son geniales:
-
Pasar
Context
al adaptador es completamente innecesario, ya queRecyclerView
puede acceder a él desde dentro de la clase -
Obtener
Context
a nivel deViewHolder
significa que lo haces cada vez que vincula o crea unViewHolder
. Duplicas operaciones. -
No creo que deba preocuparse por ninguna pérdida de memoria.
Si su adaptador permanece fuera de su vida útil de la
Activity
(lo cual sería extraño), entonces ya tiene una fuga.
Tienes algunas opciones aquí:
-
Pase
Context
como argumento a FeedAdapter y manténgalo como campo de clase -
Use la inyección de dependencia para inyectar
Context
cuando lo necesite. Sugiero leer sobre esto. Hay una gran herramienta para eso: Dagger by Square -
Obténgalo de cualquier objeto
View
. En su caso, esto podría funcionar para usted:holder.pub_image.getContext()
Como
pub_image
es unImageView
.
puedes usar esto:
itemView.getContext()