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:
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:
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 ?