使用ImageAdapter动态/编程方式填充GridView中的ImageViews

6

我试图开发一款安卓应用程序,允许用户从flickr获取数据并在GridView中显示(带有一些漂亮的3D动画)。经过一些冒险,我几乎将其运行起来了,但现在我卡住了。


问题如下:

我有一个名为“LoadPhotosTask”的UI线程,它从flickr获取图片,就像开源应用程序photostream一样。在该子类的方法onProgressUpdate(LoadedPhoto... value)中,我调用addPhoto()。到目前为止,一切都很好 - 我得到了一些漂亮的位图和Flickr.photo数据以及我需要的所有信息。

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

        addPhoto(value);
    }

另一方面,我有一个 GridView。现在我想用照片来填充它。它有一个名为 ImageAdapter 的适配器(它扩展了 BaseAdapter,请参见此 tutorial)。如果我在 ImageAdapter 类内部使用数组,我可以用一些示例图像填充 GridView。但是如果我想在运行时填充它,我不知道该怎么做。
我该如何设置 ImageAdapter 中的 getView 方法?我试图在 addPhoto 中使用我的值来填充 ImageAdapter 类中的数组,但它没有显示任何内容。
首先,我要像这样设置数组,以显示我想在网格中显示的照片数量(代码位于 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);

随后,在addPhoto方法内手动调用getView方法:
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);

}

这是ImageAdapter中的getView方法:

    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

您缺少一个重要的部分。

当您使用适配器时,可以使用名为notifyDataSetChanged()的方法。 您遗漏的逻辑如下:

在为GridView创建Adapter时,请保留适配器将使用的列表的引用。例如:

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();

就是这样。


非常感谢您的回复。我想那就是关键。好的,让我们看看......如果我理解正确,MyAdapter将是我的ImageAdapter,对吗?但是,mPhotos将是上下文?我很抱歉,我阅读了几个适配器教程,但仍然不明白。我该如何正确设置ImageAdapter/MyAdapter? - Julian Vogels
是的,MyAdapter == ImageAdapter。不是,mPhotos只是一个将保存照片的列表。对于您的情况,如果您使用ArrayAdapter<Photo>扩展ImageAdapter,在构造函数中可以传递项目列表,这会更好一些。 - Macarse
谢谢。我正在使用画廊做同样的事情。我想方法会在适配器中找到,因为画廊里没有任何东西。Stack Overflow从来没有让我失望。 :) - frostymarvelous
1
我在Android编程方面还比较新,请问是否可以提供一个完整的示例 - 包括Gallery Activity和调用Activity?这对于我来说有点难以理解。谢谢。 - positron
Macarse,感谢您的回答!我之前使用的是ArrayAdapter,忘记了在调用add或addAll时会调用该方法。现在我已经实现了自己的ImageAdapter,但忘记添加这个通知。再次感谢您! - loicram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接