【问题标题】:Populating a GridView with ImageViews dynamically/programmatically using a ImageAdapter使用 ImageAdapter 以动态/编程方式使用 ImageView 填充 GridView
【发布时间】:2011-06-09 23:04:07
【问题描述】:

我尝试开发一个 Android 应用程序,它允许用户从 flickr 获取数据并将其显示在 GridView 中(带有一些不错的 3D 动画)。经过一些冒险后,我几乎可以运行它,但现在我被卡住了。


问题来了:

我有一个 UI 线程“LoadPhotosTask”,它从 flickr 获取图片,就像开源应用程序 photostream。在该子类的方法onProgressUpdate(LoadedPhoto... value) 中,我调用addPhoto()。到目前为止一切都很好 - 我得到了一些不错的 Bitmap 和 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;

}

【问题讨论】:

    标签: android gridview dynamic adapter flickr


    【解决方案1】:

    你缺少一个关键部分。

    当您使用Adapter 时,您有一个称为notifyDataSetChanged() 的方法。 您缺少的逻辑如下:

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

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

    就是这样。

    【讨论】:

    • 非常感谢您的回复。我认为这就是重点。好吧,让我们看看...如果我理解正确,MyAdapter 将是我的 ImageAdapter,不是吗?但是,mPhotos 会是上下文吗?抱歉,我通读了几个适配器 tuts,但我仍然不明白。如何正确设置 ImageAdapter/MyAdapter?
    • 是的,MyAdapter == ImageAdapter。不,mPhotos 只是一个包含照片的列表。对于您的情况,如果您在构造函数中使用 ArrayAdapter 扩展 ImageAdapter 会更好,您可以将项目列表传递给它。
    • 谢谢。我正在对画廊做同样的事情。我认为该方法会在适配器中找到,因为库中没有任何内容。所以永远不会让我失望。 :)
    • 我对 Android 编程相当陌生,有人可以发布整个示例 - Gallery Activity 和调用 Activity 吗?我有点难以跟上。谢谢。
    • Macarse 感谢您的回答!我之前使用过 ArrayAdapter,但我忘记了在调用 add 或 addAll 时它正在调用该方法。现在我已经实现了自己的 ImageAdapter,但我忘了添加这个通知。再来一次 - 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 2012-02-23
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多