2011-01-16 17 views
6

Provo a sviluppare un'applicazione Android che consente all'utente di recuperare i dati da flickr e mostrarli in un GridView (con qualche bella animazione 3D). Dopo alcune avventure l'ho quasi fatto funzionare, ma ora sono bloccato.Compilazione di un GridView con ImageViews in modo dinamico/programmatico utilizzando un ImageAdapter


Ecco il problema:

ho ottenuto un thread UI "LoadPhotosTask" che ottiene le immagini da Flickr, proprio come l'applicazione open source photostream. Nel metodo onProgressUpdate(LoadedPhoto... value) di quella sottoclasse chiamo addPhoto(). Fino ad ora tutto bene - ho ottenuto dei bei dati Bitmap e Flickr.photo con tutte le informazioni di cui ho bisogno.

 @Override 
    public void onProgressUpdate(LoadedPhoto... value) { 

     addPhoto(value); 
    } 

D'altra parte ho uno GridView. Ora voglio riempirlo con le foto. Ha un adattatore chiamato ImageAdapter (che si estende BaseAdapter, vedere questo tutorial). Se uso un array all'interno della classe ImageAdapter posso popolare il GridView con alcune immagini di esempio. Ma se voglio popolarlo in fase di runtime, non so cosa fare.

Come è necessario impostare il metodo getView nello ImageAdapter? Stavo cercando di riempire l'array all'interno della classe ImageAdapter con i miei valori in addPhoto, ma non visualizza nulla.

Quindi prima di tutto mi è stato installando l'array con la quantità di foto che ho voluto per visualizzare nella griglia del genere (il codice è all'interno della classe ImageAdapter):

// class variable 
private ImageView[] mThumbIds; 

    [...] 

    public void setupArray(int count) { 
      this.mThumbIds = new ImageView[count]; 
     } 

Poi chiamo questo metodo con la lunghezza della mia photolist:

final Flickr.PhotoList list = params[0]; 
     final int count = list.getCount(); 
     int helper = 0; 
    imagead.setupArray(count); 

in seguito ho chiamata manualmente il metodo GetView all'interno del metodo addPhoto:

private void addPhoto(LoadedPhoto... value) { 

    ImageView image = (ImageView) mInflater.inflate(
    R.layout.grid_item_photo, null); 
    image.setImageBitmap(value[0].mBitmap); 
    image.setTag(value[0].mPhoto); 

    imagead.setmThumbIds(image, value[0].mPosition); 
    imagead.getView(value[0].mPosition, null, mpicturesGrid); 

} 

Questo è il metodo GetView all'interno ImageAdapter:

public View getView(int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { // if it's not recycled, initialize some 
     // attributes 

     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(EDGE_LENGTH, 
     EDGE_LENGTH)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(0, 0, 0, 0); 
     imageView.setVisibility(View.VISIBLE); 

    } else { 

     imageView = (ImageView) convertView; 
    } 
    imageView.setImageDrawable(mThumbIds[position].getDrawable()); 
    imageView.setTag(mThumbIds[position].getTag()); 

    return imageView; 

} 

risposta

9

ti manca un elemento chiave.

Quando si utilizza un Adapter si ha un metodo chiamato notifyDataSetChanged(). La logica mancante è la seguente:

Quando si crea loper GridView resta con un riferimento per l'elenco che verrà utilizzato dalla scheda. Qualcosa di simile:

private ArrayList<Photo> mPhotos; 
private BaseAdapter mAdapter; 
private GridView mGridView; 

onCreate: 

/* other things here */ 

mAdapter = new MyAdapter(mPhotos); 
mGridView.setAdapter(mAdapter); 

cosa si addPhoto dovrebbe fare è la seguente:

mPhotos.add(photo); 
mAdapter.notifyDataSetChanged(); 

Questo è tutto.

+0

Grazie mille per la risposta. Penso che sia questo il punto. Ok vediamo ... Se capisco correttamente, MyAdapter sarà il mio ImageAdapter, non è così? Ma allora, mPhotos sarà il contesto? Mi scuso, ho letto diversi tutorial per l'adattatore, ma ancora non capisco. Come devo impostare correttamente ImageAdapter/MyAdapter? –

+0

Sì, MyAdapter == ImageAdapter.No, mPhotos è solo una lista che terranno le foto. Per il tuo caso, sarebbe meglio se estendi ImageAdapter con ArrayAdapter nel costruttore, puoi passargli una lista di elementi. – Macarse

+0

Grazie per questo. Sto facendo la stessa cosa con Gallery. Ho pensato che il metodo sarebbe stato trovato nell'adattatore dato che nulla è nella galleria. QUINDI non mi manca mai. :) – frostymarvelous