xmlから約20枚の画像のURLを取得し、それらをグリッドビューに表示しています。1つを除いてうまくいくこと。
下にスクロールすると新しい画像の読み込みが始まりますが、もう一度上にスクロールすると読み込みが始まります。以前にロードされた画像は再びロードを開始します。
このバグを解決するにはどうすればよいですか。以前にロードされた画像はレイアウトに保持される必要があります。なぜそれ自体が保持されないのですか。
アダプターを使用して、BaseAdapterを拡張して画像を表示しています
xmlから約20枚の画像のURLを取得し、それらをグリッドビューに表示しています。1つを除いてうまくいくこと。
下にスクロールすると新しい画像の読み込みが始まりますが、もう一度上にスクロールすると読み込みが始まります。以前にロードされた画像は再びロードを開始します。
このバグを解決するにはどうすればよいですか。以前にロードされた画像はレイアウトに保持される必要があります。なぜそれ自体が保持されないのですか。
アダプターを使用して、BaseAdapterを拡張して画像を表示しています
Gridview は、AdapterView を継承する他のビューと同様に、画面に表示されるビューの量のみを使用します。したがって、スクロールすると、ビューが再利用されます。アダプターの役割は、コンテンツをビューに再割り当てすることです。
したがって、ビットマップをキャッシュする必要があります。Android 開発者側には、これに関する非常に優れたチュートリアルがあります。 http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html
(例ではグリッドビューを使用しています)
スクロールするたびに、アダプタのgetView()メソッドが呼び出されます。
したがって、1つのビューが画面に表示されるたびに、getView()メソッドが組み込まれます。そのメソッドで新しいビューを作成します。そのメソッドが呼び出されたときに画像をダウンロードすると、1つの解決策は画像をキャッシュすることです。ダウンロードする画像が少なく、サイズが小さい場合は、キーのURLと値のビットマップを使用した単純なマップで問題を解決できます。そうでない場合は、データベースを使用してください。
getView()が呼び出されるたびに、最初に画像がキャッシュにあるかどうかを確認します。画像がキャッシュにある場合は、それを使用してビューを作成します。ダウンロードしない場合は、それを使用します。
このブログhttp://blog.blundell-apps.com/imageview-with-loading-spinner/の LoaderImageView を使用して、次の関数を追加します。
public void setImageDrawable(final MyGridViewItem obj) {
mDrawable = null;
if(obj.mDrawable != null){
mDrawable = obj.mDrawable
imageLoadedHandler.sendEmptyMessage(COMPLETE);
return;
}
mSpinner.setVisibility(View.VISIBLE);
mImage.setVisibility(View.GONE);
new Thread(){
public void run() {
try {
mDrawable = getDrawableFromUrl(imageUrl);
obj.mDrawable = mDrawable;
imageLoadedHandler.sendEmptyMessage(COMPLETE);
} catch (MalformedURLException e) {
imageLoadedHandler.sendEmptyMessage(FAILED);
} catch (IOException e) {
imageLoadedHandler.sendEmptyMessage(FAILED);
}
};
}.start();
}