Заполнение GridView с помощью ImageViews динамически / программно с помощью ImageAdapter

Я пытаюсь разработать приложение для Android, которое позволяет пользователю извлекать данные из flickr и показывать его в GridView (с некоторой приятной 3D-анимацией). После некоторых приключений я почти бежал, но теперь я застрял.


Вот проблема:

Я получил тему пользовательского интерфейса «LoadPhotosTask», которая получает изображения от flickr, как и фотопоток приложения с открытым исходным кодом. В методе onProgressUpdate(LoadedPhoto... value) этого подкласса я вызываю addPhoto() . До сих пор все в порядке – у меня есть хорошие данные Bitmap и Flickr.photo со всей необходимой мне информацией.

  @Override public void onProgressUpdate(LoadedPhoto... value) { addPhoto(value); } 

С другой стороны, у меня есть GridView . Теперь я хочу заполнить его фотографиями. Он имеет адаптер под названием ImageAdapter (который расширяет BaseAdapter , см. Этот учебник ). Если я использую массив внутри класса ImageAdapter я могу заполнить GridView несколькими образцами изображений. Но если я хочу заполнить его во время выполнения, я не знаю, что делать.

Как мне настроить метод getView в ImageAdapter ? Я пытался заполнить массив внутри класса ImageAdapter своими значениями в addPhoto , но он ничего не отображает.

Поэтому, прежде всего, я настраивал массив с количеством фотографий, которые я хотел отобразить в такой сетке (код внутри класса ImageAdapter ):

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

Затем я называю этот метод с длиной моего фотолиста:

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

Впоследствии я вызываю метод getView вручную внутри метода 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); } 

Это метод getView внутри 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; } 

    Вам не хватает ключевой части.

    Когда вы используете Adapter вас есть метод, называемый notifyDataSetChanged () . Логика, которую вы не видите, такова:

    При создании Adapter для GridView оставайтесь со ссылкой на список, который будет использовать адаптер. Что-то вроде:

     private ArrayList<Photo> mPhotos; private BaseAdapter mAdapter; private GridView mGridView; onCreate: /* other things here */ mAdapter = new MyAdapter(mPhotos); mGridView.setAdapter(mAdapter); 

    То, что вы добавляете, должно делать следующее:

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

    Вот и все.