Заполнение GridView с помощью ImageViews динамически / программно с использованием ImageAdapter - PullRequest
6 голосов
/ 16 января 2011

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


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

Я получил ветку пользовательского интерфейса «LoadPhotosTask», которая получает изображения из flickr, как и приложение с открытым исходным кодом photostream . В методе onProgressUpdate(LoadedPhoto... value) этого подкласса я называю addPhoto(). До сих пор все было хорошо - я получил несколько хороших растровых данных и данных 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;

}

1 Ответ

9 голосов
/ 16 января 2011

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

Когда вы используете 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();

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...