Autore Topic: Cache immagini scaricate dalla rete in ListView  (Letto 422 volte)

Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Cache immagini scaricate dalla rete in ListView
« il: 10 Gennaio 2015, 09:59:24 CET »
0
Ciao ragazzi, sempre grazie a dei vostri preziosi suggerimenti sono riuscito ad implementare un CustomAdapter per la mia listView di dati scaricati in json dalla rete.
Adesso funziona correttamente implementando sia le stringhe che le immagini, all'evento scroll della listview vengono scaricate le immagini degli oggetti visibili della lista questo sia quando vado verso il basso sia quando torno in alto in quanto anche salendo queste giustamente vengono riscaricate dando un leggero effetto di visualizzazione prima delle immagini recedenti poi alla fine del task di download appare l'immagine corretta.
Come posso fare a mettere in cache le immagini già scaricate e controllare qualora vi siano si evitare l'avvio del task?

Il mio adapter è il seguente:

Codice (Java): [Seleziona]
public class NewsAdapter extends ArrayAdapter<News> {

    public NewsAdapter(Context context, int resource, List<News> objects) {
        super(context, resource, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.row_news, null);
            viewHolder = new ViewHolder();
            viewHolder.idNews = (TextView) convertView.findViewById(R.id.idNews);
            viewHolder.titoloNews = (TextView) convertView.findViewById(R.id.titoloNews);
            viewHolder.dataNews = (TextView) convertView.findViewById(R.id.dataNews);
            viewHolder.immagineNews = (TextView) convertView.findViewById(R.id.immagineNews);
            viewHolder.imageNews = (ImageView) convertView.findViewById(R.id.imageNews);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        News news = getItem(position);
        viewHolder.idNews.setText(news.getId());
        viewHolder.titoloNews.setText(news.getTitolo());
        viewHolder.dataNews.setText(news.getData());
        viewHolder.immagineNews.setText(news.getImmagine());

        new DownloadImageTask(viewHolder.imageNews).execute(news.getImmagine());

        return convertView;

    }

    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {

        private ImageView iv;

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

        protected Bitmap doInBackground(String... urls) {
            return loadImageFromNetwork(urls[0]);
        }

        private Bitmap loadImageFromNetwork(String url) {
            Bitmap bm = null;
            InputStream is = null;

            try {
                HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
                conn.connect();
                is = conn.getInputStream();
                bm = BitmapFactory.decodeStream(is);
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return bm;
        }

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

    private class ViewHolder {
        public TextView idNews;
        public TextView titoloNews;
        public TextView dataNews;
        public TextView immagineNews;
        public ImageView imageNews;
    }

}

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Cache immagini scaricate dalla rete in ListView
« Risposta #1 il: 10 Gennaio 2015, 10:06:28 CET »
0
Come posso fare a mettere in cache le immagini già scaricate e controllare qualora vi siano si evitare l'avvio del task?

Usa una libreria di terze parti (tipo Picasso) che fa già tutto in automatico.
Al giorno d'oggi nessuno re-inventa la ruota, anche perchè verrebbe peggio.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Re:Cache immagini scaricate dalla rete in ListView
« Risposta #2 il: 10 Gennaio 2015, 10:20:23 CET »
0
Lo so lo so, mi è stato consigliato anche in post precedenti, ma io voglio imparare come scrivermele io le cose poi capendo come funziona dietro le quinte posso fare una valutazione di utilizzo di librerie, ma potrei capire come funziona la libreria veramente solo se capisco alla base cosa c'è, non voglio che funzioni e basta, voglio capire come funziona.
Lo so è una mia fissa, però ti faccio l'esempio per i lavori web che sviluppo, sono tanto cocciuto a non usare codice di terze parti che ho creato io un CMS in php senza ausilio di framework o librerie javascript tutto scritto in codice puro, perchè mi ero scocciato di andare cercando nel codice di wordpress o prestashop cose scritte da altri e come modificarle e perchè i plugin non funzionavano e tutto il resto di problemi dati dai cms opensource.
Mi sono costruito al mia piattaforma e-commerce e blog engine così da aver e il 100% del controllo del codice ottenendo migliori performance dei cms più comuni, ci ho messo anni e lo sviluppo continua ancora oggi. Alla fine io sono uno di quelli che piuttosto di usare una libreria esterna me la scrivo io perchè voglio che faccia esattamente quello che dico e se mi viene chiesto di modificarne una funzionalità so esattamente dove mettere le mani.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Cache immagini scaricate dalla rete in ListView
« Risposta #3 il: 10 Gennaio 2015, 10:26:52 CET »
0
Lo so lo so, mi è stato consigliato anche in post precedenti, ma io voglio imparare come scrivermele io le cose poi capendo come funziona dietro le quinte posso fare una valutazione di utilizzo di librerie, ma potrei capire come funziona la libreria veramente solo se capisco alla base cosa c'è, non voglio che funzioni e basta, voglio capire come funziona.

Bene, le librerie come picasso e okhttp sono open source, puoi studiarne il codice senza problemi, così impari come si fa. Se poi vuoi farne dei tutorial per il forum ancora meglio.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store