Autore Topic: Adapter personalizzato e asynctask per immagini  (Letto 411 volte)

Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Adapter personalizzato e asynctask per immagini
« il: 03 Gennaio 2015, 10:42:41 CET »
0
Ciao ragazzi, grazie a dei consigli avuti in post precedenti sono riuscito ad arrivare a questo punto, ho creato un adapter personalizzato per visualizzare dati scaricati dalla rete in json. Una delle stringhe corrisponde ad una url da cui dover scaricare un'immagine, sto avviando l'esecuzione su un asynctask ma il problema è che non riesco ad ottenere nell'onpostexecute il riferimento all'image view, magari è una banalità, mi date qualche consiglio sul codice seguente?

In pratic qui new DownloadImageTask().execute(news.getImmagine()); gli passo la url il problema è che nell'onpost execute la variabile restituitami dal viewHolder generato nel getView non viene vista.

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().execute(news.getImmagine());

        return convertView;

    }


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

        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) {
                Log.d("ECCEZIONE DOWNLOAD", e.toString());
                e.printStackTrace();
            }
            return (Bitmap) bm;
        }

        protected void onPostExecute(Bitmap result) {
            //viewHolder.imageNews.setImageBitmap(result);
        }
    }

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

}

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Adapter personalizzato e asynctask per immagini
« Risposta #1 il: 04 Gennaio 2015, 14:21:18 CET »
0
Quando crei l'async passagli il context.

Ma il vero consiglio è usare una delle librerie più utilizzate allo scopo, che evitano di dover gestire asynctask, connessioni http....
Prova:
Picasso: https://github.com/square/picasso
Volley  : Transmitting Network Data Using Volley | Android Developers
Ion: https://github.com/koush/ion
UIL: https://github.com/nostra13/Android-Universal-Image-Loader

Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Re:Adapter personalizzato e asynctask per immagini
« Risposta #2 il: 05 Gennaio 2015, 13:18:48 CET »
0
In realtà prima di usare librerie di terze parti volevo prima capire come fare con il framework android.

Mi faresti un esempio direttamente sul codice della mia classe passandogli l Context?

Offline Dav_android

  • Utente junior
  • **
  • Post: 78
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab2 10.1
  • Sistema operativo:
    Windows 8
Re:Adapter personalizzato e asynctask per immagini
« Risposta #3 il: 10 Gennaio 2015, 09:52:06 CET »
0
Ho risolto in questo modo, pensi possa andare?

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;
    }

}