2017-04-20 1 views
-3

J'essaie d'afficher des images dans un GridView. Cette vue de grille est remplie par un adaptateur. J'ai toujours eu le problème que l'application est très laggy quand elle gonfle une nouvelle carte. Après quelques recherches sur Internet j'ai trouvé Glide, ce qui pourrait peut-être aider à améliorer la performance.Trouver le contexte de Glide Android

Maintenant, je suis coincé parce que je ne peux pas imaginer quel contexte je devrais passer à Glide.with (...):

Glide.with(**CONTEXT**).load(sights.get(i).mImageRessourceID).into(sightViewHolder.sightPhoto); 

Pour construire les cartes i utilise: MainActivity -> Fragment - > Adaptateur.

C'est le code de l'adaptateur:

public class SightCardAdapter extends RecyclerView.Adapter<SightCardAdapter.SightViewHolder> { 


public static class SightViewHolder extends RecyclerView.ViewHolder { 
    CardView cv; 
    TextView sightName; 
    ImageView sightPhoto; 

    SightViewHolder(View itemView) { 
     super(itemView); 
     cv = (CardView) itemView.findViewById(R.id.cv); 
     sightName = (TextView) itemView.findViewById(R.id.sight_name); 
     sightPhoto = (ImageView) itemView.findViewById(R.id.sight_photo); 
    } 
} 

List<Sight> sights; 

SightCardAdapter(List<Sight> sights) { 
    this.sights = sights; 
} 


@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 

    super.onAttachedToRecyclerView(recyclerView); 
} 

@Override 
public SightViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); 
    SightViewHolder pvh = new SightViewHolder(v); 
    return pvh; 
} 

@Override 
public void onBindViewHolder(SightViewHolder sightViewHolder, int i) { 
    sightViewHolder.sightName.setText(sights.get(i).mName); 
    //sightViewHolder.sightPhoto.setImageResource(sights.get(i).mImageRessourceID); 
    Glide.with().load(sights.get(i).mImageRessourceID).into(sightViewHolder.sightPhoto); // missing context 
} 

@Override 
public int getItemCount() { 
    return sights.size(); 
} 

}

Quelqu'un peut-il s'il vous plaît me donner quelques indices? Je ne peux pas l'image ce que je devrais passer

PS:. De plus, si quelqu'un a des Tipps comment rendre mon code plus efficace, je serais très reconnaissant :)

+0

contexte Pass adaptateur - SightViewHolder (Voir itemView, contexte de contexte) – MinnuKaAnae

+0

de la même manière que vous passé à LayoutInflater.from ... indice: quelle méthode de quelle classe l'avez-vous utilisée? – Selvin

+0

passe contexte en tant que paramètre se référer à la réponse de Sataym http://stackoverflow.com/a/43518232/3578677 –

Répondre

1

En passant des données à l'adaptateur passe également paramètre Contexte. Si vous appelez votre adaptateur de Fragment qui est un enfant de MainActivity, transmettez simplement getApplicationContext() en tant que contexte à votre adaptateur.

SightCardAdapter(Context context,List<Sight> sights) { 
    this.sights = sights; 
    this.context=context; 
} 

while calling from Fragment. 
SightCardAdapter(getApplicationContext(),sights); 
+0

J'ai déjà essayé cette solution. Ressemble à: Glide.avec (getApplicationContext()). load (sights.get (i) .mImageRessourceID) .into (sightViewHolder.sightPhoto); Mais Android Studio dit ne peut pas résoudre la méthode: S –

+0

Glide.with (getApplicationContext()) vous ne pouvez pas utiliser getApplicationContext() à l'intérieur de l'adaptateur. De Fragment envoyer ce contexte à votre adaptateur. –

1

Vous pouvez obtenir de Context Tout View objet.

Glide.with(sightViewHolder.sightPhoto.getContext()).load(sights.get(i).mImageRessourceID).into(sightViewHolder.sightPhoto); 
1

Contexte de passe lorsque vous créez objet pour adaptateur de code modifié ci-dessous

public class SightCardAdapter extends RecyclerView.Adapter<SightCardAdapter.SightViewHolder> { 


public static class SightViewHolder extends RecyclerView.ViewHolder { 
    CardView cv; 
    TextView sightName; 
    ImageView sightPhoto; 


    SightViewHolder(View itemView) { 
     super(itemView); 
     cv = (CardView) itemView.findViewById(R.id.cv); 
     sightName = (TextView) itemView.findViewById(R.id.sight_name); 
     sightPhoto = (ImageView) itemView.findViewById(R.id.sight_photo); 

    } 
} 
Context context; 
List<Sight> sights; 

SightCardAdapter(List<Sight> sights,Context context) { 
    this.sights = sights; 
    this.context = context; 
} 


@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 

    super.onAttachedToRecyclerView(recyclerView); 
} 

@Override 
public SightViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false); 
    SightViewHolder pvh = new SightViewHolder(v); 
    return pvh; 
} 

@Override 
public void onBindViewHolder(SightViewHolder sightViewHolder, int i) { 
    sightViewHolder.sightName.setText(sights.get(i).mName); 
    //sightViewHolder.sightPhoto.setImageResource(sights.get(i).mImageRessourceID); 
    Glide.with(context).load(sights.get(i).mImageRessourceID).into(sightViewHolder.sightPhoto); // missing context 
} 

@Override 
public int getItemCount() { 
    return sights.size(); 
} 

} 
0
Context context;//declare this globle 

SightCardAdapter(Context context, List<Sight> sights) { 
    this.context=context;// add context in constructor of adapter class 
    this.sights = sights; 
} 

Maintenant, utilisez context dans Glide comme suit:.

Glide.with(context).load(sights.get(i).mImageRessourceID).into(sightViewHolder.sightPhoto); 
1

passer votre contexte adaptateur comme celui-ci

Private Context mContext; 
SightCardAdapter(List<Sight> sights,Context mContext) { 
    this.sights = sights; 
    this.mContext = mContext; 
} 

Glide.with(mContext).load("url").into(imageView); 
0

Essayez

Ou passer le contexte de l'activité tout en créant l'objet de l'adaptateur ou l'obtenir à partir itemView.

Context context = itemView.getContext(); 
Pass this context to Glide. 
1

pour une utilisation efficace ..

private RequestManager glideManager; 

public MyAdater(Context context, Object activityOrFragment){ 
    if (object instanceof Fragment) { 
     glideManager = Glide.with((Fragment) object); 
    } else if (object instanceof Activity) { 
     glideManager = Glide.with((Activity) object); 
    } 
} 


@Override 
public void onBindViewHolder(ViewHolderGeneric viewHolder, int position) { 
    glideManager 
     .load(item.getResizedImageUrl()) 
     .placeholder(R.drawable.emptystates_card_bg_none) 
     .fitCenter() 
     .into(ivGoods); 
} 


Adaptateur

MyRecyclerAdapter adapter = new MyRecyclerAdapter(mContext, this); //this -> Activity or Fragment