2011-01-16 27 views
6

Intento desarrollar una aplicación para Android que permita al usuario obtener datos de flickr y mostrarlos en un GridView (con una buena animación 3D). Después de algunas aventuras lo tengo casi corriendo, pero ahora estoy atascado.Llenando un GridView con ImageView dinámicamente/programáticamente usando un ImageAdapter


aquí está el problema:

Tengo un hilo de interfaz de usuario "LoadPhotosTask" que obtiene las imágenes de Flickr, al igual que la aplicación de código abierto photostream. En el método onProgressUpdate(LoadedPhoto... value) de esa subclase, llamo al addPhoto(). Hasta ahora todo bien, obtuve algunos buenos datos de Bitmap y Flickr.photo con toda la información que necesito.

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

     addPhoto(value); 
    } 

Por otro lado, tengo un GridView. Ahora quiero llenarlo con las fotos. Tiene un adaptador llamado ImageAdapter (que se extiende BaseAdapter, consulte este tutorial). Si utilizo una matriz dentro de la clase ImageAdapter puedo llenar el GridView con algunas imágenes de muestra. Pero si quiero poblarlo en tiempo de ejecución, no sé qué hacer.

¿Cómo debo configurar el método getView en el ImageAdapter? Intenté llenar el conjunto dentro de la clase ImageAdapter con mis valores en addPhoto, pero no muestra nada.

Así que en primer lugar me fue la creación de la matriz con la cantidad de fotos que quería mostrar en la cuadrícula como que (código se encuentra dentro de la clase ImageAdapter):

// class variable 
private ImageView[] mThumbIds; 

    [...] 

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

Entonces llama a este método con la longitud de mi photolist:

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

Después me llama al método getView manualmente dentro del método 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); 

} 

Ese es el método getView dentro 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; 

} 

Respuesta

9

Usted se echa en falta una parte clave.

Cuando utiliza un Adapter tiene un método llamado notifyDataSetChanged(). La lógica que falta es la siguiente:

Al crear el Adapter para el GridView permanezca con una referencia para la lista que usará el adaptador. Algo así como:

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

onCreate: 

/* other things here */ 

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

Lo que addPhoto debe hacer es lo siguiente:

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

Eso es todo.

+0

Muchas gracias por su respuesta. Creo que ese es el punto. Ok, veamos ... Si entiendo correctamente, MyAdapter será mi ImageAdapter, ¿no? Pero entonces, ¿mPhotos será el contexto? Me disculpo, leí varios adaptadores tuts, pero todavía no lo entiendo. ¿Cómo debo configurar el ImageAdapter/MyAdapter correctamente? –

+0

Sí, MyAdapter == ImageAdapter.No, mPhotos es solo una lista que contendrá las fotos. Para su caso, sería mejor si extiende ImageAdapter con ArrayAdapter en el constructor puede pasarle una lista de elementos. – Macarse

+0

Gracias por esto. Estoy haciendo lo mismo con Gallery. Pensé que el método se encontraría en el adaptador ya que no hay nada en la galería. SO nunca me falla. :) – frostymarvelous

Cuestiones relacionadas