10

私はこの問題に何ヶ月も悩まされてきました (しかし、今はパフォーマンス調整中です)。bindViewただし、アダプターがレコードで最大 4 回実行する必要があると感じる理由を知りたいと切望しています。

グリッドビューを設定するカスタム カーソル アダプターがあります。

何が起こっているかを示すためのデバッグ:

03-08 14:46:47.980: I/AdapterCursorGrid(20724): newView()
03-08 14:46:48.470: I/AdapterCursorGrid(20724): bindView()
03-08 14:46:48.570: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() Record Id: 1
03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0
03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() View Type: 0
03-08 14:46:48.570: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:48.600: D/AdapterCursorGrid(20724): bindView() Avatar empty...
03-08 14:46:48.690: D/AdapterCursorGrid(20724): bindView() Picture creation...
03-08 14:46:49.490: I/AdapterCursorGrid(20724): bindView()
03-08 14:46:49.501: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() Record Id: 1
03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0
03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() View Type: 0
03-08 14:46:49.501: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:49.521: D/AdapterCursorGrid(20724): bindView() Avatar empty...
03-08 14:46:49.521: D/AdapterCursorGrid(20724): bindView() Picture creation...
03-08 14:46:50.320: I/AdapterCursorGrid(20724): newView()
03-08 14:46:51.170: I/AdapterCursorGrid(20724): bindView()
03-08 14:46:51.180: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:51.180: I/AdapterCursorGrid(20724): bindView() Record Id: 1
03-08 14:46:51.180: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0
03-08 14:46:51.190: I/AdapterCursorGrid(20724): bindView() View Type: 0
03-08 14:46:51.190: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:51.190: D/AdapterCursorGrid(20724): bindView() Avatar empty...
03-08 14:46:51.200: D/AdapterCursorGrid(20724): bindView() Picture creation...
03-08 14:46:51.870: I/AdapterCursorGrid(20724): bindView()
03-08 14:46:51.896: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:51.896: I/AdapterCursorGrid(20724): bindView() Record Id: 1
03-08 14:46:51.900: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0
03-08 14:46:51.900: I/AdapterCursorGrid(20724): bindView() View Type: 0
03-08 14:46:51.900: I/AdapterCursorGrid(20724): --------------------------
03-08 14:46:51.900: D/AdapterCursorGrid(20724): bindView() Avatar empty...
03-08 14:46:51.900: D/AdapterCursorGrid(20724): bindView() Picture creation...

「アバターが空です...」と「画像の作成...」は、2つの特定ImageViewのsを処理および更新していることを示す単純なデバッグです。

なぜbindView何度も実行されているのですか?これにはどのような理由があり、これを解決するにはどうすればよいですか?

論理的に言えばbindView、1 回 (そしてアダプターが更新されるたびに 1 回) 実行することを期待していますが、これは間違っているのでしょうか?

4

3 に答える 3

15

オペレーティング システムはbindView、リストを正しく測定して配置できるように、複数回呼び出す場合があります。これはバグというほどではありません。これは、スクロールの滑らかさとともに、bindView実装が可能な限り効率的である必要がある理由です。Android Developers Pageで詳しく説明されている、役立つヒントやコツがいくつかあります。

于 2013-03-08T15:30:28.430 に答える
12

また、bindView が予想よりも多く呼び出されていることもわかりました。ListView の高さが wrap_content に設定されました。match_parent に変更した後、呼び出しの数が大幅に減少しました。

このソリューションの功績は、この質問に対する回答になります。カスタム CursorAdapter の bindView は 77 回呼び出されました...何か間違ったことをしましたか?

于 2014-06-10T11:23:02.683 に答える
0

私が発見したことの1つは、新しい画像と古い画像がまったく同じサイズでない限り、ImageView画像を変更するとレイアウトが要求されることです。ImageView

内部的にはとをImageView使用して、レイアウトを要求するかどうかを決定します。getIntrinsicWidth()getIntrinsicHeight()

次のようなことを試してください (ただし、現在の幅/高さを非同期ロードに送信し、バックグラウンドから戻る前にビットマップのサイズを変更する方が理にかなっています):

public void replaceBitmap(ImageView iv, Bitmap bitmap) {
    Drawable current = iv.getDrawable();
    if (bitmap.getWidth() != current.getIntrinsicHeight()
            || bitmap.getHeight() != current.getIntrinsicHeight()) {
        bitmap = Bitmap.createScaledBitmap(bitmap,
            current.getIntrinsicWidth(), current.getIntrinsicHeight(), true);
    }
    iv.setImageBitmap(bitmap);
}
于 2014-04-26T10:52:09.660 に答える