1

GridViewのgetView()メソッドで、次のことを行っています。

public View getView(int position, View convertView, ViewGroup parent) {
       convertView = this.inflater.inflate(..);
       ImageView image = (ImageView) convertView
                .findViewById(R.id.imageButton1);
       imageLoader.displayImage("URL/"
                + sampleArray.get(position), image);

ここでのsampleArrayは、アダプタの作成時にロードした配列です。これは、これらの画像を遅延読み込みするときに使用され(このツール:https ://github.com/nostra13/Android-Universal-Image-Loader )、基本的に、読み込む画像を決定する画像URLの一部です。さて、私が知る限り、ベストプラクティスは、ビューがnullの場合にのみビューを膨らませることです。

if(convertView == null){
   this.inflater.inflate(...);

これを行うと、実際には高速になりますが、画像の読み込みがおかしいです。下にスクロールして上にスクロールすると、画像が行内で切り替わります。つまり、一番上の行では、1列目の画像が2列目の画像にランダムに切り替わる可能性があります。私が使用している配列(sampleArray)は変更されません。呼び出されるpositionとgetView()と関係があることは知っていますが、なぜこの動作が発生するのかわかりません。

現在の方法(コードの最初のブロック)で実行すると、毎回膨張します。完全に機能しますが、読み込みが遅くなります。この動作がこのように機能するのはなぜですか?

前もって感謝します。

編集

これが私が起こっていると思うことです。GetView()が複数回呼び出されていますが、これは「position」引数と同期していないため、配列から間違った要素が選択されています。私はまだそれに戸惑っています。

4

2 に答える 2

0

元の画像をクリーンアップしようとしましたか?

image.setImageBitmap(null);

画像ローダーのソースコードを確認します。方法の1つは次のとおりです。

public void displayImage(String uri, ImageView imageView, DisplayImageOptions options) 

オプションを「resetViewBeforeLoading=true」に設定することもできると思います

奇妙なことが起こると思う理由は、ローダーが新しいビットマップをアタッチする前に、ビューが表示時に元のビットマップのままであるグリッドビューによって再利用されるためです。

それでも機能しない場合は、lemmeにお知らせください。

編集

もっと調べてみましたが、その理由はリサイクルによるものだと思います。もっと明確に説明させてください。

理由:

画面上のデータに合計12個のセルがあるとすると、表示されるビューは9つだけです。

非常に最初に、gridviewは9を作成して画面に表示します。

view_1_1 view_1_2 view_1_3

view_2_1 view_2_2 view_2_3

view_3_1 view_3_2 view_3_3

スクロール(上にスクロールして4行目を表示)した後、現時点では、グリッドビューはview_1_1、view_1_2、view_1_3をごみ箱に入れます。次に、recycle-binから行4の3つのビューを取得します。これらは、getViewに「convertView」として配置されるため、view_1_1、view_1_2、view_1_3が再利用されます。

最初に、ビューがビットマップで添付されているとします

view_1_1:bitmap_1_1

view_1_2:bitmap_1_2

view_1_3:bitmap_1_3

これらのビューがリサイクルされて行4に表示されると、ビットマップは非同期で読み込まれるため、bitmap_1_1、bitmap_1_2、bitmap_1_3が行4に表示され、後でそれらの新しいビットマップに置き換えられます。

確認方法

1.私が好きなグリッドビューをデバッグする1つの方法は、画像に「id」を配置することです。簡単な方法は、「ImageView」を配置して、各imageViewの上にオーバーレイビューを配置し、次のようにidを書き込むことです。

String s = viewInfoHolder.imageView.toString();
viewInfoHolder.overlay.setText(s.substring(s.length() -3));//last 3 chars are enough and cleanup

2.交換を遅くするために、

com.nostra13.universalimageloader.core.LoadAndDisplayImageTask

メソッドの最後の行:

public void run() 

から:

handler.post(displayBitmapTask);

に:

handler.postDelayed(displayBitmapTask, 2000);

グリッドビューがどのように機能するかを正確に知ることができます。

お役に立てば幸いです:)

于 2013-01-24T03:43:12.157 に答える
0

あなたは使用する必要があります

.resetViewBeforeLoading()

そしておそらく

.showStubImage(R.drawable.empty_image)

UILを初期化するときにDisplayImageOptionsで。これにより、ロード前にビューがリセットされます。これは、gridviewのビューを再利用しているために必要です。

于 2013-02-26T09:51:58.870 に答える