Utilizzo di convertView in una gridView

di il
3 risposte

Utilizzo di convertView in una gridView

Salve a tutti, io sto avendo grosse difficoltà a capire come si usa convertView per aumentare le performance di una gridView di immagini. Ho capito il concetto, credo, ma è il codice che mi sfugge!
Sì, sono alle primissime armi...
Ho una gridView di immagini che facendola scorrere va spesso e volentieri in outOfMemoryError.
Ho cercato di implementare la convertView prendendo qua e là da diversi tutorial trovati su internet, ma mi sa che non ci ho capito niente.
Io ho una serie di immagini caricate in un array, che devono scorrere in questa gridView. ecco il codice:

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class ImageAdapter1 extends BaseAdapter {
    private Context mContext;

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

    // Constructor
    public ImageAdapter1(Context c) {
        mContext = c;
    }

    @Override
    public int getCount() {
        return mThumbIds.length;
    }

    @Override
    public Object getItem(int position) {
        return mThumbIds[position];
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            imageView = new ImageView(mContext);
            imageView.setImageResource(mThumbIds[position]);
            imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
            imageView.setLayoutParams(new GridView.LayoutParams(350, 300));
        } else {
            imageView = (ImageView) convertView;
        }
       return imageView;
    }
}
Ora, credo che il codice qui sopra sia semplicemente sbagliato. La gridView si apre e scorre su alcuni dispositivi, emulati e reali, ma continua a darmi outOfMemory error in altri. Devo dire però che funziona meglio di prima che non avevo proprio implementato convertView, quindi presumo che in qualche modo lo stia utilizzando.

Sto cercando di capire i concetti di inflater e viewHolder, ma ho problemi di comprendonio.
Qualcuno può farmi un esempio di come si dovrebbero usare in questo caso?
E un'altra cosa: è giusto riempire l'array dentro l'adapter o devo farlo da un'altra parte?

3 Risposte

  • Re: Utilizzo di convertView in una gridView

    Prova a leggerti questo tutorial, dovrebbe schiarirti un po' le idee.

    Comunque l'adapter dovrebbe essere una sorta di "ponte" fra la lista e i dati, quindi è concettualmente sbagliato riempire l'array lì dentro. Inoltre prova a considerare l'utilizzo di un ArrayAdapter, direi che fa più al caso tuo.
  • Re: Utilizzo di convertView in una gridView

    Ok, ho capito qualcosa in più, ma ora ho un altro problema.
    Sto implementando nel mio progetto il tutorial che ho trovato a questo indirizzo:
    http://javatechig.com/android/android-gridview-example-building-image-gallery-in-android
    che è abbastanza simile a quello che vorrei ottenere io.
    In effetti la gridview funziona ma quando tocco su un'immagine dovrebbe aprire un'altra activity con l'immagine ingrandita (e altre cose), e quello non funziona più.
    Ora, seguendo l'esempio di cui sopra ho messo l'array delle immagini in string.xml.
    Nell'esempio le immagini venivano passate all'activity successiva, che le apre ingrandite, tramite intent, ma se ci provo nella mia app mi dà un errore binder, evidentemente sono troppo grosse per essere passate da una activity a un'altra.
    Vorrei quindi nell'activity con l'immagine ingrandita prendere di nuovo l'immagine dall'array, ho passato la
    position
    tramite intent, ma non ci riesco.
    In effetti non ho capito come fa il codice che ho preso da esempio a popolare la gridView, e quindi non sono riuscito a replicarlo nell'activity successiva.
    Io prima, quando avevo ancora l'array nell'imageAdapter, facevo così:
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.full_image);
    
            // get intent data
            Intent i = getIntent();
    
            // Selected image id
            final int position = i.getExtras().getInt("id");
            ImageAdapterBambini15 imageAdapter = new ImageAdapterCustom(this);
    
            TouchImageView imageView = (TouchImageView) findViewById(R.id.full_image_view);
            imageView.setImageResource(imageAdapter.mThumbIds[position]);
    
    dove "id" è il parametro
    position
    passato tramite intent, e mThumbsIds l'array dentro l'imageAdapter.

    Ma se io l'array ce l'ho dentro string.xml, come faccio a richiamare nella mia activity l'immagine alla posizione desiderata (indicata dal parametro "id" o position che dir si voglia?

    Spero di essermi spiegato decentemente...
  • Re: Utilizzo di convertView in una gridView

    Secondo me ti complichi la vita inutilmente. Se hai messo già l'array nel file strings.xml (immagino sotto forma di string-array) allora puoi semlicemente ottenerlo tramite questo codice:
    
    String[] images = getResources().getStringArray(R.array.<nome_array>);
    
    E a questo punto accedi all'array nella maniera tradizionale.

    Comunque secondo me ti conviene prima prenderti un libro o comunque studiare il materiale a disposizione (ad esempio qua) e poi dedicarti allo sviluppo delle app!
Devi accedere o registrarti per scrivere nel forum
3 risposte