2015-07-22 17 views
9

Ho una vista elenco che mostra i video con la loro immagine in miniatura, sto usando l'adattatore del cursore (Fetches using ContentProvider). Il problema è che il numero di voci della lista aumenta le prestazioni della visualizzazione elenco diventando molto povere. Per favore fatemi sapere il modo migliore per renderlo carico pigro.Caricamento lento in ListView con immagine. (Adattatore per cursori)

Nuovo: Finalmente ho trovato qualche soluzione. Funziona bene per me. Per favore fatemi sapere se avete qualche consiglio. Il mio nuovo codice è qui. (Usa stack con patern produttore dei consumatori e filo bacground per selezionatrici)

@Override public void Bindview (Panorama vista, contesto Context, cursore Cursore) {

ViewHolder holder = (ViewHolder) view.getTag(); 
    String name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)); 
    int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)); 
    holder.getIdView().setText(name); 
    holder.getThumbView().setTag((Integer)id); 
    if(LazyLoader.getInstance().containsKey(id)) { 
     Object bitmap = LazyLoader.getInstance().getBitMap(id); 
     if(null != bitmap && (bitmap instanceof Bitmap)) { 
      holder.getThumbView().setImageBitmap((Bitmap)bitmap); 
     } else { 
      holder.getThumbView().setImageDrawable(null); 
     } 
    } else { 
     holder.getThumbView().setImageDrawable(null); 
     LazyItem lazyItem = new LazyItem(); 
     lazyItem.setId(id); 
     lazyItem.setThumbNail(holder.getThumbView()); 
     LazyLoader.getInstance().putItem(lazyItem); 
    } 
} 




public class LazyLoaderHelper extends Thread { 

    private ContentResolver resolver = null; 
    private Activity activity; 
    private boolean isActive = true; 
    ExecutorService executor; 


    public LazyLoaderHelper(Activity _activity , ContentResolver _resolver) { 
     resolver = _resolver; 
     activity = _activity; 
     isActive = true; 
     executor = Executors.newFixedThreadPool(10); 
    } 

    public void stopThread() { 
     isActive = false; 
     executor.shutdown(); 
    } 

    @Override 
    public void run() { 
     while (isActive) { 
      if(LazyLoader.getInstance().getSize() > 0) { 
       final LazyItem lazyItem = LazyLoader.getInstance().getItem(); 
       if(null != lazyItem) { 

        executor.execute(new Runnable() { 
         @Override 
         public void run() { 

          BitmapFactory.Options options = new BitmapFactory.Options(); 
          options.inSampleSize = 1; 

          if ((null != resolver) && (null != activity)) { 
           final Bitmap thumb = MediaStore.Video.Thumbnails.getThumbnail(resolver, lazyItem.getId(), MediaStore.Video.Thumbnails.MICRO_KIND, options); 
           if (null != thumb) { 
            LazyLoader.getInstance().putBitMap(lazyItem.getId(), thumb); 
           } else { 
            LazyLoader.getInstance().putBitMap(lazyItem.getId(), new Object()); 
           } 

           if ((Integer) lazyItem.getThumbNail().getTag() == lazyItem.getId()) { 
            activity.runOnUiThread(new Runnable() { 
             @Override 
             public void run() { 
              if (null != thumb) { 
               lazyItem.getThumbNail().setImageBitmap(thumb); 
              } else { 
               lazyItem.getThumbNail().setImageDrawable(null); 
              } 
             } 
            }); 
           } 
          } 
         } 
        }); 
       } 
      } 

     } 
    } 
} 
+3

Per il caricamento dell'immagine pigro, consiglio [UIL] (https://github.com/nostra13/Android-Universal-Image-Loader/wiki). –

+1

inserisci il tuo codice adattatore – pskink

+1

usi ViewBinder? in tal caso, inserisci anche il suo codice – pskink

risposta

2

A mio parere, si dovrebbe provare the UIL (Universal Image Loader) Quella lib può visualizzare le miniature dei video e le miniature delle immagini.

Edit: Aggiungi imageLoader.displayImage(String uri, ImageView imgView, DisplayImageOptions options); al vostro getView del vostro custom adapter

String URI può essere file:///mnt/sdcard/video.mp4 // dalla scheda SD (video anteprima)

Spero che questo aiuto! In caso di problemi, si prega di commento qui sotto

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post - puoi sempre commentare i tuoi post, e una volta che hai [reputazione] sufficiente (http://stackoverflow.com/help/whats-reputation) essere in grado di [commentare qualsiasi post] (http://stackoverflow.com/help/privileges/comment). –

+0

L'ho capito. Grazie, Gabriele –

+0

Sebbene questo link possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – Gosu

2
  • sto usando la libreria aQuery per lazy loading delle bitmap (supporta anche HTTP). È molto semplice e facile da integrare con il codice esistente senza apportare molte modifiche.
  • Mantenere il layout degli articoli il più semplice possibile.
  • Assicurarsi di implementare correttamente il riciclaggio e il modello e il supporto di visualizzazione.

Maggiori informazioni sulla lista scorrimento continuo è here

12

È possibile utilizzare libreria picaso per Android è open source e può facilmente integrarsi con nell'applicazione è possibile scaricare la libreria da github dal basso legame

http://square.github.io/picasso/

e può facilmente implementare lazy loading utilizzando metodi seguenti nella lista la scheda di visualizzazione

Picasso supporta sia segnaposti di download che di errore come funzionalità opzionali.

Picasso.with (contesto) .load (url) .placeholder (R.drawable.user_placeholder) .error (R.drawable.user_placeholder_error) .into (ImageView);

Risorse, risorse, file, fornitori di contenuti sono tutti supportati come fonti di immagini.

Picasso.con (contesto) .load (R.drawable.landing_screen) .into (imageView1); Picasso.with (context) .load ("file: ///android_asset/DvpvklR.png") .into (imageView2); Picasso.con (context) .load (new File (...)). in (imageView3);

4

Sono disponibili varie librerie per il caricamento lento dell'immagine. Picasso & La planata è molto buona. L'integrazione è anche molto facile. È possibile utilizzare Picasso se la qualità dell'immagine è la più importante. Usa la planata per caricare più velocemente. Anche se puoi preferire qualcuno, ti consiglio di usare Glide.

Per le immagini scambiate potrebbe esserci un problema nel caricamento asincrono delle immagini. Come fai a sapere del completamento del thread. Qualsiasi thread può caricare l'immagine in qualsiasi momento.

Grazie

2

vi consiglio di combinare il modello ViewHolder con la libreria chiamata Picasso.

Quando si carica l'immagine, Picasso si presenta come:

public static class ViewHolder { 
    ... 
    public ImageView imageView; 
} 

@Override 
    public void bindView(View view, Context context, Cursor cursor) { 
    ... 
    String thumbnailURL = "image_url_from_cursor"; 
    Picasso.with(context).load(thumbnailURL) 
            .placeholder(R.drawable.ic_default_img) 
            .error(R.drawable.ic_default_img) 
            .into(holder.imageView); 
    ... 

Speranza che aiuta.

2

Per utilizzare il caricamento lazy è buono ma preferisco ancora la libreria di Android di Picasso, esso imposterà automaticamente il requisito di cache e richiederà meno tempo per il caricamento delle immagini. Sto usando l'adattatore pager per visualizzare l'animazione del cercapersone e qui ho richiesto il numero di immagini per questo scopo per diverse pagine diverse. Ecco l'esempio per questo.

public Object instantiateItem(ViewGroup container, int position) { 
     final ViewGroup cnt=container; 


      final int val=position; 


      View itemView = mLayoutInflater.inflate(R.layout.smallnewsview, container, false); 

      try 
      { 

      ImageView img=(ImageView)itemView.findViewById(R.id.imageView1); 

      Picasso.with(context) 
       .load("just image url....") 
       .into(img, new Callback() { 

      @Override 
      public void onSuccess() { 
      pbh.setVisibility(View.GONE); 
      } 

      @Override 
      public void onError() { 
       pbh.setVisibility(View.VISIBLE); 
      } 
     }); 

Ora per la prossima volta richiamerà automaticamente la cache anziché dal server ogni volta. Mi piace molto questa libreria.

Qui puoi ottenere anche la libreria.

http://square.github.io/picasso/

Spero che questo sarà molto utile per il vostro supporto gentile.

Problemi correlati