GridView di immagini con ViewHolder più lenta che senza

marcellino247

Nuovo Utente
4 Mag 2015
10
0
1
Salve a tutti, sono alla mia prima app (come forse avrete notato, con tutte le domande che ho già inserito in questo forum) e quindi per ogni problema sbatto la testa contro il muro finché non mi decido a chiedere aiuto.

Ho una GridView con immagini, e vorrei implementare il ViewHolder per migliorare le performance. Di seguito il codice.

XML per le dimensioni della singola cella della griglia:
Codice:
 <ImageView
        android:layout_width="wrap_content"
        android:layout_height="@dimen/grid_view_item_height" 
android:id="@+id/immagineGriglia" />

e il codice java dell'image adapter:
Codice:
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

public class ImageAdapterAdulti15 extends ArrayAdapter {
    private Context context;
    private int layoutResourceId;
    private ArrayList data = new ArrayList();

        // Keep all Images in array
    public Integer[] mThumbIds = {
            R.drawable.image1, R.drawable.image2........
    };

    // Constructor
    public ImageAdapterAdulti15(Context context, int layoutResourceId, ArrayList data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override

    public View getView(int position, View convertView, ViewGroup parent) {
        View cella = convertView;
        ViewHolder holder = null;

        if (cella == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            cella = inflater.inflate(layoutResourceId, parent, false);
            holder = new ViewHolder();
            holder.immagineGriglia = (ImageView) cella.findViewById(R.id.immagineGriglia);
            cella.setTag(holder);
        } else {
            holder = (ViewHolder) cella.getTag();
        }

        ImageItem item = (ImageItem) data.get(position);
        holder.immagineGriglia.setImageBitmap(item.getImage());
        return cella;
    }

    static class ViewHolder {
        ImageView immagineGriglia;     
    }     
}

Come dicevo nel titolo, in questo modo la GridView risulta più lenta e con più tendenza a piantarsi per OutOfMemoryError rispetto alla stessa griglia senza ViewHolder.
Direi quindi che il codice di cui sopra è sbagliato o incompleto.
Sto avendo davvero difficoltà a capire non tanto il concetto di ViewHolder, quanto piuttosto il codice per farlo funzionare. Sapreste mica dirmi dove sbaglio?
Grazie!
 

marcellino247

Nuovo Utente
4 Mag 2015
10
0
1
Ho provato a modificare questa riga del codice in questo modo:

Codice:
ImageItem item = (ImageItem) data.get(position);
 holder.immagineGriglia.setImageDrawable(context.getResources().getDrawable(mThumbIds[position]));
 return cella;

Ora la gridView scorre più fluida, ma mi sembra che causi qualche memory leak.
ogni immagine è cliccabile, e il tocco porta a una pagina con una versione ingrandita e zoomabile della stessa immagine.
Se tocco un'immagine funziona, ma dopo un po' di chiudi-apri-chiudi-apri si pianta. OutOfMemoryError.

Su alcuni device, addirittura, (sto provando con diversi device emulati da Genimotion e due cellulari reali) non si apre proprio l'activity con la gridView, si pianta prima.
Potrebbe essere un problema di memory leak? E' un argomento che per me è ancora abbastanza misterioso...
Come posso capire dove sta il problema? So che esiste un'estensione per Eclipse per verificare l'uso della memoria, c'è qualcosa per Android Studio, visto che per il momento ho imparato a usare quello e vorrei evitare, almeno inizialmente, di incasinarmi ulteriormente imparando a usare un altro programma?
 

michelep

Utente Attivo
21 Nov 2013
123
4
0
www.michelepierri.it
Ho provato a modificare questa riga del codice in questo modo:

Codice:
ImageItem item = (ImageItem) data.get(position);
 holder.immagineGriglia.setImageDrawable(context.getResources().getDrawable(mThumbIds[position]));
 return cella;

Ora la gridView scorre più fluida, ma mi sembra che causi qualche memory leak.
ogni immagine è cliccabile, e il tocco porta a una pagina con una versione ingrandita e zoomabile della stessa immagine.
Se tocco un'immagine funziona, ma dopo un po' di chiudi-apri-chiudi-apri si pianta. OutOfMemoryError.

Su alcuni device, addirittura, (sto provando con diversi device emulati da Genimotion e due cellulari reali) non si apre proprio l'activity con la gridView, si pianta prima.
Potrebbe essere un problema di memory leak? E' un argomento che per me è ancora abbastanza misterioso...
Come posso capire dove sta il problema? So che esiste un'estensione per Eclipse per verificare l'uso della memoria, c'è qualcosa per Android Studio, visto che per il momento ho imparato a usare quello e vorrei evitare, almeno inizialmente, di incasinarmi ulteriormente imparando a usare un altro programma?
Dai un occhio a questo qui:
http://www.vogella.com/tutorials/EclipseMemoryAnalyzer/article.html
 
Discussioni simili
Autore Titolo Forum Risposte Data
M Cella del Gridview ASP.NET 0
M Gridview: altezza celle adattabile allo schermo Sviluppo app per Android 3
M elementi di una gridview appaiono in ordine casuale invece di quello deciso da me Sviluppo app per Android 2
K GridView e trascinamento tra le celle Sviluppo app per Android 1
riminese77 Gridview sempre visibile in cella ASP.NET 7
mythar GridView e Inserimento ASP.NET 9
S [VB.NET]: Coordinate immagini dentro una PictureBox Visual Basic 0
G Perché il mio sito su Google news fa vedere le immagini degli articoli la mia foto profilo? WordPress 1
M Immagini non usate WordPress 0
elmonarca77 Utilizzo e licenze immagini Webdesign e Grafica 4
S Risoluzione Immagini e Connessione Joomla 0
G Il mio sito dopo aver abilitato l'ssl non visualizza le immagini con indirizzi senza ssl HTML e CSS 0
A WordPress e immagini Hosting 0
Y RITAGLIO IMMAGINI Javascript 0
R Immagini html HTML e CSS 2
E Come gestire al meglio le immagini legno grande formato Photoshop 0
M Random Immagini + Testi PHP 13
L form immagini per il database PHP 0
Ricky80 Coordinazione immagini HTML e CSS 4
P Percorsi e immagini. PHP 0
N Indicizzazione immagini su Google Google Search Console 0
L Import Immagini piattaforma IONIC Sviluppo app per Android 0
L Import massivo di immagini in tabelle piattaforma IONIC Presentati al Forum 1
P Script upload immagini jQuery 0
E Salvare immagini PHP 0
S problema salvataggio immagini Photoshop 0
R Immagini scontornate: che formato? HTML e CSS 4
A Sovrapposizione Immagini Photoshop 0
Cosina Mostrare immagini da una cartella, ma solo un numero definito PHP 12
Tommy03 Gestire dimensioni immagini PHP 4
M Aiuto con inserimento immagini WordPress 6
L Scmporre una foto dotata di varie immagini in piu layer Photoshop 2
M Impossibile visionare la immagini dall'App. IP Cam e Videosorveglianza 8
A Array di immagini Sviluppo app per Android 10
L Come spostare cartella immagini/video PHP 1
A Cornici immagini per sito Web Wordpress WordPress 1
M Semplice visualizzatore di immagini [risolto con plugin wp] PHP 7
R uploader di immagini e text PHP 0
S Importazione immagini PHP 3
beatle [Photoshop] problema inserimento immagini Photoshop 1
L [PHP] Invio Immagini PHP 1
I [PHP] generazione url "uguale" che punta a due immagini diverse PHP 0
W Immagini professionali a costi sostenibili Discussioni Varie 1
bluebirdoncanvas [Photoshop] problema dimensioni immagini o zoom Photoshop 0
andreas88 Immagini non leggibili dopo trasferimento alla scheda SD Smartphone e tablet 0
zorro Aggiunta di immagini al sito Leggi, Normative e Fisco 0
M [PHP] Selezionare immagini directory non presenti in db PHP 11
romeocharly [PHP] Script per rinominare in automatico le immagini inviate da ftp PHP 0
I [PHP] Immagini caricate su server diverse da quelle mostrate PHP 19
kiai969 Stesse immagini su WordPress SEO e Posizionamento 2

Discussioni simili