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 :
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 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); } } }
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 ?
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; }
Partager