7
votes

Android - problème avec des images de chargement paresseux dans une liste

Ceci est un scénario très courant: affichant des images dans une liste de liste qui doivent être téléchargées à partir d'Internet.

En ce moment, j'ai une sous-classe personnalisée de Arrayadapter que j'utilise pour la liste de liste. Dans ma mise en œuvre de My GeveView () de l'arrayadapter, j'apparais un fil séparé pour charger une image. Une fois le chargement terminé, il lève les yeux sur l'image de l'image appropriée et définit l'image avec imageview.setimagedimagedrable (). Donc, la solution que j'ai utilisée est une sorte de similaire à celle-ci: Charge paresseuse d'images à ListView

Le problème que j'ai, c'est que dès que je prends l'appel à SetItimagedrable () sur ImageView, la liste d'envoi d'une autre rafraîchit toutes les lignes actuellement visibles de la liste! Cela se traduit par une sorte de boucle infinie:

  1. GeveView () est appelé
  2. Le fil est généré pour charger l'image
  3. l'image est chargée; Sétitimagedrable () est appelé sur ImageView
  4. ListView le ramasse pour une certaine raison et se rafraîchit
  5. Pour la liste de réception à l'actualisation, GeveView () est appelée à chaque ligne visible. Nous revenons donc à l'étape 1 et le tout se répète

    Aussi loin que possible, la solution proposée dans "Android - Comment puis-je faire une charge paresseuse d'images dans ListView" (voir le lien ci-dessus) ne fonctionne tout simplement pas. On pourrait ressembler à cela, mais cela fonctionnera très lentement car en arrière-plan, il conserve le rechargement des lignes actuellement visibles.

    Quelqu'un a-t-il rencontré cela avant et / ou avoir une solution pour cela?


0 commentaires

4 Réponses :


3
votes

dans la solution liée, fetchdrawableoNeDread () ne doit être appelé que si la vue ne possède pas déjà le bon dessinable.

une vue n'a pas d'introduction si getdrawable () retourne null.

Si vous réutilisez des machines à sous, vous avez des vues Vous devez aller plus loin et gérer l'état. Si vos points de vue ont une variable de membre stockant l'URL, et un booléen à dire s'il est chargé, il serait facile de savoir s'il faut appeler fetchdrawableoreadhead () ou non, par exemple.

Je spéculerais que le document TOSTRING () Détail de la trajectoire est détaillé sur lequel l'image a été chargée. (Si ce n'est pas le cas, vous pourriez la sous-classement que le pouliage est retourné pour le faire ainsi). Dans ce cas, vous pouvez éviter le booléen décrit ci-dessus et simplement faire une comparaison pour déterminer si c'est le droit amusant ou s'il faut chercher un remplaçant.

En outre, votre GeveView () sur une ligne visible doit garantir que ceux qui ne sont plus visibles sont déchargés, pour empêcher l'épuisement de la mémoire. Une finesse serait de déplacer les images plus visibles aux références douces (donc elles sont déchargées lorsque la mémoire est nécessaire) comme une autre affiche sur le fil d'origine noté.


3 commentaires

Oui, j'utilise une carte pour mettre en cache les images. Mais cela n'a pas d'importance, puisque j'appelle toujours toujours stitimagedrable () qui déclenche à nouveau l'actualisation. Si je pouvais en quelque sorte désactiver le reflet, cela résoudrait mon problème. Je n'utilise pas encore Softreferences (mais je le ferai), mais c'est juste une optimisation de la mémoire, cela ne résout pas la boucle infinie


Bon point que j'ai mal compris ce que vous vouliez dire par 'thread est généré par charger image'. Je vais réécrire ma réponse


Merci pour vos réponses rapides :) Qu'est-ce que vous décrivez maintenant résout le problème lorsque vous ne réutilisez pas les vues d'affichage des lignes comme je le fais. Avec la réutilisation des lignes, je veux dire en utilisant l'argument "ConvertView" qui est donné à GeveView (). Connaissez-vous une solution pour cela lors de la réutilisation des vues en ligne? (Parce que dans ce cas, vous devez appeler la séminage () à chaque fois)



2
votes

J'ai un Thumbnailadapter qui enveloppe tout ce motif qui peut aider. < / p>


0 commentaires

4
votes

J'ai utilisé le code dans le lien suivant: Une autre question Stackoverflow

J'ai fait de petits changements afin de résoudre le problème de la vue de recyclage. Le code suivant contient ma solution qui résout le problème du recyclage: xxx


0 commentaires

4
votes

J'ai eu le même problème.

Après presque 2 jours de débogage intensif / optimisant et d'essayer de comprendre, pourquoi mon grevView () est appelé à toutes les vues encore et encore lorsque vous utilisez SETITIMAGEBITMAP () D'une ligne, je suis arrivé à une solution sale:

1) étendre un imageview que vous utilisez pour toutes les images dans Votre liste

2) dans ce imageview écrase la méthode xxx

3 3) sale, mais pour moi ça marche

4) profit;)


1 commentaires

Lorsque des images sur la liste ont la même taille et votre image d'image est également une taille fixe (ne pas envelopper le contenu). Cela m'a aidé, merci :)