3

GridViewのリストを表示するために使用していますImageView。画像は、ImageLoaderライブラリを介してインターネットからロードされます。カスタムアダプタ(拡張)も実装しましたBaseAdapter

public class ImagePreviewAdapter extends BaseAdapter {

    private Context mContext;

    private List<LastPost> mPosts = new ArrayList<LastPost>();

    private ImageLoader mImageLoader;

    private ImageLoadingListener mLoadingListener;

    public ImagePreviewAdapter(Context context, List<LastPost> posts, ImageLoadingListener listener) {
        this.mContext = context;
        this.mPosts = posts;
        this.mLoadingListener = listener;

        Activity activity = (Activity)mContext;
        this.mImageLoader = ((MeanwhileInRussia)activity.getApplication()).getImageLoader();
    }

    public int getCount() {
        return mPosts.size();
    }

    public LastPost getItem(int position) {
        return mPosts.get(position);
    }

    public long getItemId(int position) {
        LastPost post = mPosts.get(position);
        return Long.parseLong(post.getId());
    }

    public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;

        // if it's not recycled, initialize some attributes
        if (convertView == null) {
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(125, 125));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(0, 0, 0, 0);

            String imageLink = mPosts.get(position).getImageurl();
            DisplayImageOptions displayImgOptions = ImageLoaderConfigUtil
                .getDisplayImageOptions(mContext);

            if (mLoadingListener != null) {
                mImageLoader
                    .displayImage(imageLink, imageView, displayImgOptions, mLoadingListener);
           } else {
                mImageLoader.displayImage(imageLink, imageView, displayImgOptions);
           }

        } else {
            ImageView restoringView = (ImageView)convertView;
            imageView = restoringView;
        }

        return imageView;
    }
}

システムがメソッドを呼び出すたびにgetView()、新しいImageViewオブジェクトを作成し、ImageLoaderに画像を入れるように依頼します(もちろん、convertView == nullの場合)。URLの最初の部分では、すべてが正常に機能します。しかし、私の問題は2番目の部分から始まりGridViewます。最初の部分のコピーだけで新しい画像はありません...問題はどこかに隠れていることに気づきましたconvertView == null:すべての理論的に新しい要素について、このチェックは常にFALSEです!そして、新しいオブジェクトを作成してURLから画像をロードする代わりに、私のコードはいくつかの古いオブジェクトを新しい位置に配置します。興味深い事実:getItemId(position)メソッドは、LastPostオブジェクトの正しいIDを返します。これは、正しいLastPostsオブジェクトのアダプターに誤ったビューがあることを意味しますか?

助言がありますか?ありがとう!

4

2 に答える 2

3

これを試して....

public class ImagePreviewAdapter extends BaseAdapter 
{

private Context mContext;

private List<LastPost> mPosts = new ArrayList<LastPost>();

private ImageLoader mImageLoader;

private ImageLoadingListener mLoadingListener;

/**
 * Constructor
 * 
 * @param context
 * @param posts
 * @param listener - using for showing loading progress
 */
public ImagePreviewAdapter(Context context, List<LastPost> posts, ImageLoadingListener listener) {
    this.mContext = context;
    this.mPosts = posts;
    this.mLoadingListener = listener;

    Activity activity = (Activity)mContext;
    this.mImageLoader = ((MeanwhileInRussia)activity.getApplication()).getImageLoader();
}

public int getCount() {
    return mPosts.size();
}

public LastPost getItem(int position) {
    return mPosts.get(position);
}

public long getItemId(int position) {
    LastPost post = mPosts.get(position);
    return Long.parseLong(post.getId());
}

/*
 * Create a new ImageView for each item referenced by the Adapter
 */
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;

    // if it's not recycled, initialize some attributes
    if (convertView == null) {
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(125, 125));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(0, 0, 0, 0);

    } 
   else 
      {
        ImageView restoringView = (ImageView)convertView;
        imageView = restoringView;
     }
        final String imageLink = mPosts.get(position).getImageurl();
        final DisplayImageOptions displayImgOptions = ImageLoaderConfigUtil
            .getDisplayImageOptions(mContext);

   if (mLoadingListener != null) 
    {
       mImageLoader.displayImage(imageLink, imageView,displayImgOptions,mLoadingListener);
       }
     else 
        {
            mImageLoader.displayImage(imageLink, imageView, displayImgOptions);
       }

    return imageView;
}
}
于 2012-09-09T15:52:01.937 に答える
1

これを試して

public View getView(int position, View convertView, ViewGroup parent) {

   ViewHolder holder = null;
    // if it's not recycled, initialize some attributes
    if (convertView == null) {
        holder = new ViewHolder();
        holder.image = new ImageView(mContext);
        holder.image.setLayoutParams(new GridView.LayoutParams(125, 125));
        holder.image.setScaleType(ImageView.ScaleType.CENTER_CROP);
        holder.image.setPadding(0, 0, 0, 0);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    String imageLink = mPosts.get(position).getImageurl();
    DisplayImageOptions displayImgOptions = ImageLoaderConfigUtil.getDisplayImageOptions(mContext);
    mImageLoader.displayImage(imageLink, holder.image, displayImgOptions);

    return convertView;
}


protected class ViewHolder{
    ImageView image;
}
于 2012-09-09T14:35:32.020 に答える