2013-07-17 7 views
8

Android-Universal-Image-Loaderライブラリを使用して、GridViewセルのImageViewにリモートピクチャを読み込みます。Android-Universal-Image-Loaderは読み込まれた画像をグリッドビューのスクロールに保存しません

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

問題: GridViewのすべてが正常に動作を開始し、イメージを持つ活動が細胞に表示されたら、その後、 ここimageLoader構成

私はグリッドを下にスクロールし(グリッドには約20個のアイテムがあります)、他のイメージが正しく読み込まれます。 しかし、一度上にスクロールすると、すでにロードされているイメージが再び読み込みを開始します。

いくつかのスクロールした後、上下のグリッドがすべての画像を保存し、もう消えません。

誰かが同様の問題を抱えていたか、私が間違っていたことを知っていましたか? ありがとうございます。

を追加しました:

@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:ここに は私のアダプタでGetViewメソッドです。この問題を解決するために他のコード(グリッド・アダプター)を見たいのかどうか教えてください。

ジョン

+1

メモリやディスクにはキャッシュを使用しません。表示オプションでキャッシングを有効にしてください。 – NOSTRA

+0

.cacheInMemory()と.cacheOnDisc()のために1.8.5バージョンにライブラリを更新した後に削除しましたが、.cacheInMemory()を使用しても、初めて写真が保持されず、アプリがグリッド内のすべての画像をキャッシュする前に少なくとも4回はダウンする。 –

+0

廃止予定のメソッドのJavaドキュメントを読むべきです。だから、 '.cacheInMemory(true)'と '.cacheOnDisc(true)'を代わりに使うべきであることがわかります。 UILサンプルアプリであなたの問題が見えますか? – NOSTRA

答えて

16

Universal-Image-Loaderデモで同じ問題が発生しました。ライブラリ開発者が次回のアップデートで問題を解決することを願っています。

UPDATEnostra13の助けを借りて、固定の問題は、あなたが1.9 versionにライブラリを更新し、imageViewで画像を表示するこの方法を使用する必要があります。

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

それは私の問題を解決しました。あなたがこれを行うべき理由のいくつかの詳細も

Utils.imageLoaderFeatured.displayImage(listing.getをwirtingことで、同じ問題と解決の問題に直面していたherehere

+0

私はこれを試しましたが、プレースホルダを表示するのではなく、読み込まれるイメージの場所に既に読み込まれたイメージを表示するという問題が発生し、いつかそれらの正しいイメージがロードされた後に – NarendraJi

1

アダプターを使用して、円滑かつ効果的なスクロールの流れを作るためにViewHolderを実装する必要があります。 getView()で提供されている位置に画像w.r.tのタグを提供しても問題はありません。

+0

こんにちはAnchit、あなたの答えをありがとうが、私はviewHolderを使用して、すべて説明したようにした。投稿にgetViewメソッドを追加しました。どうぞご覧ください。 –

-1

.Iを見つけることができます(「写真」)、ホルダー.image、Utils.imageLoaderOptionsFeatured); .......

行内if(view == null)...変換ビューを表示する== nullのみ次にイメージをロードして表示します。これらはあなたの問題を解決します.....

+1

私はすでにこのように試してみました。大文字と小文字のイメージは常に変わります。 –

0

StaggeredGridViewを使用すると、同じ問題が発生します。 メモリキャッシュとImageAwareメソッドを使用しても、解決されません。

私のために働いたのは、キャッシュメモリを4MBから10MBに拡張したことだけでした。リストイメージは小さいですが、私はビューのヘッダーとして非常に大きなイメージを持っています。

私は、imageViewsが長いクリックでもリフレッシュされていることに気付きました。これはGridViewでも有効ですか?

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

1

アダプタのgetView()メソッドでsetタグを使用しないでください。常にアダプタのgetview()メソッドでviewidを検索してみてください。

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

View view = convertView; 
ViewHolder holder; 


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



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;} 
+0

これは私には良い答えのように見えますが、特にアップボンスを求めないでください。あなたが良いコンテンツを作れば、時間内にそれを得るでしょう。 – halfer

1

ImageLoaderインスタンスとDisplayImageOptionsインスタンスは、一度だけ宣言する必要があります。おそらくコンストラクタにあります。

ImageLoader imageLoader = ImageLoader.getInstance(); 
DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true) 
     .cacheOnDisc(true).resetViewBeforeLoading(true) 
     .showImageForEmptyUri(fallbackImage) 
     .showImageOnFail(fallbackImage) 
     .showImageOnLoading(fallbackImage).build(); 
関連する問題