8

Android-Universal-Image-Loaderライブラリを使用して、リモート画像を GridView セルの ImageView にロードしています。

ここで、imageLoader の構成は次のとおりです。

new ImageLoaderConfiguration.Builder(Config.context)
.threadPriority(Thread.NORM_PRIORITY - 2)
.memoryCacheSize(20 * 1024 * 1024) // 20 Mb
.memoryCache(new LruMemoryCache(20 * 1024 * 1024))
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.enableLogging() // Not necessary in common
.build();

および表示オプション:

new DisplayImageOptions.Builder()
.showStubImage(R.drawable.blank)
.showImageForEmptyUri(R.drawable.no_image)
.build();

問題: グリッドビューでのアクティビティがすべて正常に機能し、画像がセルに表示されると、グリッドを下にスクロールし (グリッドに約 20 の項目があります)、他の画像が適切に読み込まれます。しかし、上にスクロールすると、すでにロードされている画像が再びロードされ始めます。

グリッドを上下に数回スクロールすると、すべての画像が保存され、それらはもう消えません。

誰かが同様の問題に遭遇しましたか、それとも私が何を間違えたか知っていますか。手伝ってくれてありがとう。

追加: これが私のアダプターのgetViewメソッドです:

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

    View view = convertView;
    ViewHolder holder;

    if ( view == null ) {           
        view = Config.context.getLayoutInflater().inflate(R.layout.featured, null);
        holder = new ViewHolder();

        holder.titleText = (TextView) view.findViewById(R.id.featured_title);
        holder.priceText = (TextView) view.findViewById(R.id.featured_price);
        holder.image = (ImageView) view.findViewById(R.id.thumbnail_image);

        view.setTag(holder);
    }
    else {
        holder = (ViewHolder) view.getTag();
    }

    HashMap<String, String> listing = listings.get(position);

    /* set text values */
    holder.titleText.setText(listing.get("title"));
    holder.priceText.setText(listing.get("price"));

    /* load image to list (AsyncTask) */
    Utils.imageLoaderFeatured.displayImage(listing.get("photo"), holder.image, Utils.imageLoaderOptionsFeatured);

    return view;
}

PS。この問題を解決するために他のコード (グリッド アダプターなど) が必要な場合はお知らせください。

ジョン

4

6 に答える 6

16

Universal-Image-Loader Demo で同じ問題に遭遇しました。ライブラリの開発者が次の更新で問題を解決してくれることを願っています。

更新: nostra13の助けを借りて問題が修正されました。ライブラリを1.9 バージョンに更新し、次の方法で画像を表示する必要がありますimageView

ImageAware imageAware = new ImageViewAware(imageView, false);
imageLoader.displayImage(imageUri, imageAware);

それは私の問題を解決しました。これを行う必要がある理由の詳細については、ここここを参照してください。

于 2013-09-17T09:33:35.593 に答える
1

ImageLoader および DisplayImageOptions インスタンスは 1 回だけ宣言する必要があります。おそらくコンストラクターで。

ImageLoader imageLoader = ImageLoader.getInstance();
DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
        .cacheOnDisc(true).resetViewBeforeLoading(true)
        .showImageForEmptyUri(fallbackImage)
        .showImageOnFail(fallbackImage)
        .showImageOnLoading(fallbackImage).build();
于 2016-01-20T13:03:30.020 に答える
1

ViewHolderスクロールのフローをスムーズかつ効果的にするには、Adapter を使用してから を実装する必要があります。提供された位置にタグを付けて画像にタグを付ければgetView()、問題はありません。

于 2013-07-17T08:28:30.480 に答える
0

StaggeredGridView を使用して、ここでも同じ問題が発生します。メモリキャッシュとImageAware方式でも解決しません。

私にとって唯一うまくいったことは、キャッシュメモリを 4 MB から 10 MB に拡張することでした。リスト画像は小さいですが、ビューのヘッダーとして非常に大きな画像があります。

長いクリックでも imageViews が更新されることに気付きましたが、これは GridView でも有効ですか?

とにかく、メモリキャッシュの制限を拡張すると、これも修正されました。

于 2014-01-30T12:03:42.127 に答える