Autore Topic: caricare immagini in una listview  (Letto 389 volte)

Offline prezzemolo86

  • Nuovo arrivato
  • *
  • Post: 36
  • Respect: +1
    • Mostra profilo
caricare immagini in una listview
« il: 26 Giugno 2013, 00:41:36 CEST »
0
Ciao,
vi spiego in breve, devo fare un catalogo . Inizialmente devo visualizzare un elenco di categorie che recupero in remoto da un file xml. Per far ciò starto un asinctask e parserizzando xml ottengo una lista di oggetti Categoria che mi vanno a riempire l'arrayadapter.

Per ogni categoria, però, devo caricare anche un'immagine. Dall'oggetto Categoria di ogni riga posso recuperare il path dell'immagine.

Per il caricamento delle immagini ho fatto qualcosa, che però o crasha in alcuni telefoni o comporta un tempo di attesa enorme in quanto poi carico le immagini tutte in una volta. Sarebbe più opportuno caricarle una alla volta, dando appunto l'idea di un caricamento.
Ho, quindi, seguito questo post

http://stackoverflow.com/questions/7729133/using-asynctask-to-load-images-in-listview


 ma il caricamento non è fluido...

posto il mio codice:


Codice (Java): [Seleziona]
public class DownloadBitmapTask         extends AsyncTask<Categoria, Void, Bitmap>
{
        private static String LogTag = "DownloadBitmapTask";

        private RelativeLayout image;
        private String path;
       
       
        private File dir;
        private FileManager fm;
        private Context appCntx;
        private ProgressBar bar;
       
        public DownloadBitmapTask(RelativeLayout image, ProgressBar bar, Context appCntx)
        {
                this.image = image;
                this.path =image.getTag().toString();
               
                this.appCntx = appCntx;
                this.bar = bar;
               
                fm = new FileManager();
                dir = fm.createStorageDir(appCntx, "categorie");

        }

        /*
         * eseguito in un thread in background si occupa di eseguire il task
         * vero e proprio. Accetta un parametro di tipo Params (il primo generic
         * definito) e ritorna un oggetto di tipo Result
         */

        @Override
        protected Bitmap doInBackground(Categoria... categorie)
        {
                try {

                        Categoria categoria = categorie[0];

                        Log.d(LogTag, "categoria: "+categoria.getTitolo());
                        BitmapManager bm = new BitmapManager( fm, dir);




                        Bitmap bitmap;
                        String file_name = categoria.getImageUrl();
                        String urlImage = URLString.URL_IMG_CATALOGO_ELENCO_PRODOTTI_HEADER.replace("XXX", file_name);


                        bm.setName_file(file_name);
                        bm.setUrlImage(urlImage);

                        if(image.getTag().toString().equals("no_url"))
                        {
                                //Log.d(LogTag, "carico bitmap da file");
                                bitmap = bm.getBitmapFromFile();
                        }
                        else
                        {
                                //Log.d(LogTag, "carico bitmap da remoto");
                                bitmap = bm.getBitmapFromURL();
                        }

                        if(bitmap!=null)
                        {
                                return bitmap;
                        }
                        else
                        {
                                Log.d(LogTag, "la bitmap "+file_name+" non esiste :( ");
                                return null;

                        }




                } catch (Exception e) {
                        return null;
                }
        }

        /*
         * eseguito nel thread principale e si occupa di aggiornare
         * l’interfaccia dopo l’esecuzione per mostrare i dati scaricati o
         * calcolati nel task che vengono passati come parametro
         */

        @Override
        protected void onPostExecute(Bitmap result)
        {

               
      if( result!= null && image != null){
          //imv.setVisibility(View.VISIBLE);
          Drawable dr =  new BitmapDrawable(appCntx.getResources(), result);
          image.setBackgroundDrawable(dr);
          bar.setVisibility(View.GONE);
      }
      else {
                image.setBackgroundColor(Color.WHITE);
                bar.setVisibility(View.VISIBLE);
        }


               
        }

}



Codice (Java): [Seleziona]
public class ElencoCategorieAdapter extends ArrayAdapter<Categoria>
{

        Typeface font;
        Context context;



        public ElencoCategorieAdapter(Context context)
        {
                super(context, R.layout.categoria_row, new ArrayList<Categoria>());
                this.context = context;
                font = Typeface.createFromAsset(this.getContext().getAssets(), MyFont.fontRoundLight);
        }


        static class CategoriaViewHolder {
                TextView titolo;
                TextView nome;         
                //ImageView image;
                RelativeLayout latodx;
                View icona;
                ProgressBar progressBar;
        }

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

                CategoriaViewHolder viewHolder;

                /**********************************************************************/

                if (v == null) {
                        LayoutInflater li = (LayoutInflater) getContext().getSystemService(
                                        Context.LAYOUT_INFLATER_SERVICE);
                        v = li.inflate(R.layout.categoria_row, parent, false);

                        viewHolder = new CategoriaViewHolder();
                        viewHolder.titolo = (TextView) v.findViewById(R.id.titolo_categoria);
                        viewHolder.titolo.setTypeface(font);
                        viewHolder.nome = (TextView) v.findViewById(R.id.nome_categoria);
                        viewHolder.nome.setTypeface(font);             
                        viewHolder.icona = v.findViewById(R.id.categoriaIcon);
                        viewHolder.latodx = (RelativeLayout)v.findViewById(R.id.categorie_row_dx);
                        viewHolder.latodx.setTag("url");
                        //viewHolder.image = (ImageView) v.findViewById(R.id.image_categoria);
                        viewHolder.progressBar = (ProgressBar) v.findViewById(R.id.progressBarImage);/* */


                        v.setTag(viewHolder);
                }
                else
                {
                        viewHolder = (CategoriaViewHolder) v.getTag();
                }

                Categoria categoria = getItem(position);

                if (categoria != null) {

                       
                        viewHolder.titolo.setText(categoria.getTitolo());
                        viewHolder.nome.setText(categoria.getNome());


                        Drawable d = CategoriaIconaChooser.getDrawableFromCategoryName(categoria.getNome(), v.getResources());
                        if(d != null)
                                viewHolder.icona.setBackgroundDrawable(d);

                       
                        new DownloadBitmapTask(viewHolder.latodx,viewHolder.progressBar,context.getApplicationContext()).execute(categoria);
                        viewHolder.latodx.setTag("no_url");

                        /**/

                        /*      Bitmap bitmap = cacheImmagini.get(categoria.getId());
                        if(bitmap!=null)
                        {
                                Drawable dr = new BitmapDrawable(v.getResources(),bitmap);

                                viewHolder.latodx.setBackgroundDrawable(dr);
                        }

                        else
                        {
                                viewHolder.latodx.setBackgroundColor(Color.WHITE);
                                viewHolder.progressBar.setVisibility(View.VISIBLE);

                        }*/




                }
                return v;
                /***********************************************************************/








        }


Le progressbar per ogni immagine scompaiono e appaiono le immagini, ma non quando scrollo le immagini vengono ricaricate, quindi tutto va a scatti.
Secondo voi è una cosa giusta chiamare tale thread dentro l'adapter?


Post unito: 26 Giugno 2013, 11:26:21 CEST
:-(
« Ultima modifica: 26 Giugno 2013, 11:26:21 CEST da prezzemolo86, Reason: Merged DoublePost »