Заполнение GridView с ImageViews динамически / программно с помощью ImageAdapter
я пытаюсь разработать приложение для Android, которое позволяет пользователю извлекать данные из flickr и показывать их в GridView (С хорошей 3D-анимацией). После некоторых приключений я почти запустил его, но теперь я застрял.
вот в чем проблема:
я получил поток пользовательского интерфейса "LoadPhotosTask", который получает изображения из flickr, Как и приложение с открытым исходным кодом фотогалерея. В методе onProgressUpdate(LoadedPhoto... value) этого подкласса я называю addPhoto(). До сих пор все в порядке - у меня есть хорошее растровое изображение и Flickr.фото данные со всей необходимой информацией.
        @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;
}
1 ответов
вам не хватает ключевой части.
при использовании 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);
то, что вы addPhoto должны сделать, это следующее:
mPhotos.add(photo);
mAdapter.notifyDataSetChanged();
вот именно.
