Autore Topic: Caricamento immagine da remoto  (Letto 515 volte)

Offline k3v1n

  • Utente junior
  • **
  • Post: 61
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S3
Caricamento immagine da remoto
« il: 19 Aprile 2013, 21:23:55 CEST »
0
Salve a tutti,

ho una lista nella quale per ciascuna riga compare un'immagine. L'immagine risiede su un server remoto. Ho letto un po in rete che una soluzione utile è creare un task di questo tipo:

Codice: [Seleziona]
public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImageTask(ImageView bmImage) {
                this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
                Bitmap mIcon11 = null;
                if (urls[0] != null) {
                        String urldisplay = urls[0];
                        try {
                                InputStream in = new java.net.URL(urldisplay).openStream();
                                mIcon11 = BitmapFactory.decodeStream(in);
                        } catch (Exception e) {
                                Log.e("Error", e.getMessage());
                                e.printStackTrace();
                        }
                }
                return mIcon11;
        }

        protected void onPostExecute(Bitmap result) {
                bmImage.setImageBitmap(result);
        }
}

e per ciascuna immagine caricarlo così:

Codice: [Seleziona]
new DownloadImageTask(myImage).execute(url);

Il problema è che lo scroll della vista sfasa tutte le immagini che continuano a caricarsi in modo randomico.

Avete un'alternativa oppure un consiglio per migliorare la funzionalità?

Grazie

Luca

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Caricamento immagine da remoto
« Risposta #1 il: 19 Aprile 2013, 22:04:02 CEST »
0
Universal image loader
https://github.com/nostra13/Android-Universal-Image-Loader

ottima libreria open source con una tonnellata di opzioni tra cui scegliere... Ci metterai un po' a prendere confidenza con tutte le opzioni, ma una volta fatto diventa veramente potente e flessibile :)
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline k3v1n

  • Utente junior
  • **
  • Post: 61
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S3
Re:Caricamento immagine da remoto
« Risposta #2 il: 20 Aprile 2013, 11:21:39 CEST »
0
Universal image loader
https://github.com/nostra13/Android-Universal-Image-Loader

ottima libreria open source con una tonnellata di opzioni tra cui scegliere... Ci metterai un po' a prendere confidenza con tutte le opzioni, ma una volta fatto diventa veramente potente e flessibile :)

grazie mille ilseric per il post della libreria. Veramente ben fatta. L'ho integrata e resa funzionante all'interno della mia app. Il problema però persiste.

A questo punto credo ci sia qualcosa di errato nella gestione del mio adapter che ha in carico la gestione delle righe della lista:

Nell'activity creo l'adapter
Codice: [Seleziona]
FriendsAdapter adapter = new FriendsAdapter(getBaseContext(), R.layout.cell_friend_layout, friends);
friendRequestsList = (ListView) findViewById(R.id.friendsRequestList);
friendRequestsList.setAdapter(adapter);

Codice: [Seleziona]
@Override
        public View getView(int position, View convertView, ViewGroup parent) {
                View row = convertView;

                if (row == null) {
                        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        row = inflater.inflate(layoutResourceId, parent, false);

                        holder = new UserHolder();
                        holder.nickname = (TextView) row.findViewById(R.id.cellTextView);
                        holder.extraButton = (Button) row.findViewById(R.id.extraButton);
                        holder.userImage = (ImageView) row.findViewById(R.id.userImage);

                        row.setTag(holder);
                } else {
                        holder = (UserHolder) row.getTag();
                }
               
                User c = data.get(position);

                ImageLoader.getInstance().loadImage(c.getImageUrl(), new SimpleImageLoadingListener() {
                        @Override
                        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                                Log.d(LoggerCode.TAG, "loading image: " + imageUri);
                                holder.userImage.setImageBitmap(loadedImage);
                        }
                });

                return row;
        }

Consigli? L'immagine viene caricata più volte... me ne accordo perchè prima ne carica una e poi la sovrascrive con un'altra. Molto strano

Help me please

Luca

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Caricamento immagine da remoto
« Risposta #3 il: 20 Aprile 2013, 13:46:59 CEST »
0
la variabile holder dove è definita? Nel senso che se è definita a livello di classe potrebbe dare problemi...

Mettila subito dopo View row = convertView;

Così:
Codice (Java): [Seleziona]
View row = convertView;
UserHolder holder;

E poi lo inizializzi a nuovo se la view è null, altrimenti lo prendi col gettag

Inoltre il metodo per mostrare l'immagine e non solo caricarla in memoria è displayimage e non loadimage :)
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.