Bitmap con adattatore di listview personalizzato
-
21-12-2019 - |
Domanda
Sto cercando di caricare le immagini nella mia lista di listview da un adattatore personalizzato ma le bitmaps non visualizzano le immagini finché non scorrerò verso il basso e quindi scorrere indietro e non so perché!All'inizio Quando avevo caricato le immagini, l'applicazione si è schiantata perché non stavo caricando le immagini in modo efficiente.
(Sto memorizzando immagini in un DB di codificato a base64. So che non è una grande cosa da fare, ma ho bisogno di ottenere solo le cose il più rapido possibile).
domanda bonus Qual è il modo migliore per attivare un evento dopo che due chiamate DB asincrono sono complete?
Il mio codice per caricare bitmap:
public Bitmap decodeBitmap(String image, int reqWidth, int reqHeight)
{
byte[] decodedByte = Base64.decode(image, 0);
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length, options);
options.inSampleSize = calculateSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
Bitmap bmp = BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length, options);
return bmp;
}
public int calculateSize(BitmapFactory.Options options, int reqWidth, int reqHeight)
{
final int height = options.outHeight;
final int width = options.outWidth;
int size = 1;
if (height > reqHeight || width > reqWidth)
{
if (width > height)
{
size = Math.round((float) height / (float) reqHeight);
}
else
{
size = Math.round((float) width / (float) reqWidth);
}
}
return size;
}
.
Soluzione
Il modo migliore e più semplice per caricare le immagini in imageviews è di utilizzare un processo di sfondo per eseguire l'attività, poiché il blocco dell'interfaccia sarà una cattiva esperienza utente. Sono un sacco di campioni di codice online, ad esempio è possibile utilizzare la classe ImageLoader da questo tutorial. Basta aggiungerlo al tuo progetto e usarlo come:
ImageLoader loader = new ImageLoader(context);
loader.DisplayImage(url, imagview);
.
Modifica: Quando lo prendi dal web, probabilmente stai ottenendo l'immagine come un flusso. Potresti farlo, ma il modo più efficiente e popolare per affrontare le immagini nei database, è quello di non memorizzare i dati effettivi dell'immagine nel database, poiché l'operazione di lettura / scrittura non è efficiente.
Invece ciò che puoi fare è, per memorizzare il flusso che ottieni dal web a un file in qualche cartella, e una volta che lo memorizzi, memorizza il percorso che punta nel database in cui si trova l'immagine. In questo modo il tuo database è molto più leggero e apri l'immagine solo quando ne hai bisogno. In realtà questo è il modo corretto di gestire le immagini perché una volta che la dimensione dell'immagine aumenta, leggendo da esso non sarà possibile, poiché Android limita la dimensione della finestra del cursore a 1 MB.
Quindi ti consiglio di modificare il tuo codice come spiegato.