リストビューのスクロールがぎくしゃくする問題を特定しました。スクロール中にディスクから画像をロードしています。サンプルコードは次のとおりです。
private class MyAdapter extends ArrayAdapter<MyListItemExt> {
//...
public View getView(int position, View convertView, ViewGroup parent) {
//...
Bitmap bit = SharedCode.sharedGetImageFromDiskOrInternet(thisAppContext, "contacts" + File.separator + data.image_file_name);
if (bit != null) {
ViewTreeObserver vto = icon.getViewTreeObserver();
vto.addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
icon.getViewTreeObserver().removeGlobalOnLayoutListener(this);
icon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
SharedCode.sharedUtilScaleImage(icon,false);
}
}
);
icon.setImageBitmap(bit);
icon.setBackgroundColor(data.backgroundColorInt);
icon.setPadding(1, 1, 1, 1);
icon.setVisibility(View.VISIBLE);
}
ここで async を使用するのが賢明かどうかはわかりません... (もしそうなら、それを行う最適な方法です) ユーザーがメインの ui スレッドでスクロールし、アイコンの参照が無効になった場合、それは悪いことです。
これにより、起動時にすべての画像をプリフェッチするという別のオプションが残されますが、画像をメモリに保持するのは好きではありません。
バックグラウンドで画像をロードし、ユーザーがまだリストビューに iem を表示している場合に、ロード時に画像を表示する非同期構造を使用することは可能ですか? これで「ベストプラクティス」はありますか?(私はまだAndroidの新人です)