IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Chargement asynchrone d'images d'une liste.


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 60
    Points : 35
    Points
    35
    Par défaut Chargement asynchrone d'images d'une liste.
    Bonjour,
    J'affiche une liste avec une ImageView et une TextView. Je voudrais télécharger de façon asynchrone les images et les afficher au fur et à mesure qu'elles soient télécharger pour ne pas trop ralentir la navigation entre les fenêtres.

    J'appelle mon AsyncTask pour chaque nouvel item directement dans l'adaptateur, voilà le code :
    La classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    public class DownloadImageTask extends AsyncTask<String, Void, Drawable> {
     
        private static HashMap<String, Drawable> listImages = new HashMap<String, Drawable>();    
        private static ImageView _imgView;
     
        public DownloadImageTask(ImageView imgView){
            super();
            _imgView = imgView;
     
        }
     
        protected Drawable doInBackground(String... url) {
            return loadImageFromUrl(url[0]);
        }
     
        protected void onPostExecute(Drawable result) {
            try{
                _imgView.setImageDrawable(result);
            } catch (Exception e) {
            _imgView.setImageResource(R.drawable.ic_menu_info_details);
            }
        }
     
     
        public static Drawable loadImageFromUrl(String url) {
     
              if (!listImages.containsValue(url)) {
                InputStream inputStream;
                try {
                  inputStream = new URL(url).openStream();
                } catch (IOException e) {
                  throw new RuntimeException(e);
                }
               Drawable dr = Drawable.createFromStream(inputStream, "src");
               listImages.put(url, dr);
               return dr;
     
              } else {
     
                 return listImages.get(url);
     
              }
     
        }
     
    }
    L'adaptateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    public class ItemAdapter extends ArrayAdapter<Item>{
     
     
        int resource;
        private static ImageView imgView;
     
        public ItemAdapter(Context _context, int _resource, List<Item> _items) {
            super(_context, _resource, _items);
            resource = _resource;
        }
     
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
     
            LinearLayout newsView;
     
            Item item = getItem(position);
     
            String strPubDate = item.pubDate;
     
            String title = item.getTitle();
     
            String imgUrl = item.getImageUrl();
     
            if (convertView == null){
                newsView = new LinearLayout(getContext());
                String inflater = Context.LAYOUT_INFLATER_SERVICE;
                LayoutInflater vi;
                vi = (LayoutInflater)getContext().getSystemService(inflater);
                vi.inflate(resource, newsView, true);
            }
            else {
                newsView = (LinearLayout) convertView;
            }
     
     
            TextView txtTitle = (TextView)newsView.findViewById(R.id.txtTitleItemSummary);
            txtTitle.setText(title);
     
             imgView = (ImageView)newsView.findViewById(R.id.imgViewItemSummary);
     
     
     
                imgView.setImageResource(R.drawable.icon);
     
     
                DownloadImageTask dit = new DownloadImageTask(imgView);
                dit.execute(imgUrl);
     
     
     
     
     
            if(!item.pubDate.equals("")){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.FRANCE);
            try {
                Date d = sdf.parse(strPubDate);
                TextView txtDate = (TextView)newsView.findViewById(R.id.txtPubDateElement);
     
                txtDate.setText("Publié le " + DateFormat.format("dd/MM/yyyy", d));
     
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            }
     
            return newsView;
        }
    Alors, je vois les images apparaitre au fur et à mesure, mais elles toutes dans la même ImageView, plus précisement la dernière de ma liste ! Une idée du problème ?

  2. #2
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Salut,

    Avant de regarder le soucis, je t'invite à lire l'article paru sur le blog de google sur le téléchargement d'image asynchrone (qui correspond à ta problématique) :
    L'article :
    http://android-developers.blogspot.c...rformance.html

    Les sources :
    http://code.google.com/p/android-ima...magedownloader


    Si tu n'arrives pas à résoudre ton soucis avec ce code / ces explications, n'hésite pas à revenir.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 60
    Points : 35
    Points
    35
    Par défaut
    J'ai justement déjà fouillé par là ainsi que certains sujets sur le forum.

    ah, j'ai trouvé, j'ai retesté avec le lien, merci beaucoup ! Le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    public class DownloadImageTask extends AsyncTask<String, Drawable, Drawable> {
     
    	private static HashMap<String, Drawable> listImages = new HashMap<String, Drawable>();	
    	private final WeakReference<ImageView> imageViewReference;
     
    	public DownloadImageTask(ImageView imageView){
    		super();
    		imageViewReference = new WeakReference<ImageView>(imageView);
    	}
     
    		@Override
    		protected Drawable doInBackground(String... url) {
     
    			Drawable d = loadImageFromUrl(url[0]);
    			publishProgress(d);
     
    			return d;
     
    		}
     
    		@Override
    		protected void onProgressUpdate(Drawable...d){
     
     
    		}
     
     
     
     
     
    		@Override
    		protected void onPostExecute(Drawable d) {
     
     
    	        if (imageViewReference != null) {
    	            ImageView imageView = imageViewReference.get();
    	            if (imageView != null) {
    	                imageView.setImageDrawable(d);
    	            }
    	        }
     
    		}
     
     
     
     
     
     
    	public static Drawable loadImageFromUrl(String url) {
     
    		  if (!listImages.containsValue(url)) {
    		    InputStream inputStream;
    		    try {
    		      inputStream = new URL(url).openStream();
    		    } catch (IOException e) {
    		      throw new RuntimeException(e);
    		    }
    		   Drawable dr = Drawable.createFromStream(inputStream, "src");
    		   listImages.put(url, dr);
    		   return dr;
     
    		  } else {
     
    		     return listImages.get(url);
     
    		  }
     
    	}
     
     
     
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Chargement Asynchrone d'image dans une liste
    Par Invité dans le forum Android
    Réponses: 4
    Dernier message: 10/05/2010, 17h48
  2. Mettre des images dans une liste déroulante
    Par PrinceMaster77 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 01/12/2006, 16h35
  3. [VB.NET][ListView]des images dans une list view
    Par pcdj dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/12/2005, 13h08
  4. [CSS] Spécifié les tailles d'image d'une liste...
    Par Invité dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 18/11/2005, 21h06
  5. Réponses: 3
    Dernier message: 02/07/2004, 14h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo