カスタム アダプターを実装して、場所に関連する情報を表示するダイアログ ボックスを作成しました (ダイアログの各エントリは、画像、住所を表示するテキスト フィールド、都市と国を表示するテキスト フィールドで構成されます)。 ...) ViewHolder パターンを使用するほかにアダプターのメソッドを使用する SoftReference クラスを使用して、作成されたビューへの参照を保存し、OutOfMemoryError が発生する前に GC を削除できるようにします。私の目標は、より高速で効率的なキャッシュを構築することです。私のカスタムアダプターのコードの下:
public class LocationsAdapter extends ArrayAdapter<LocationInfo> {
Context context;
int layourResourceId;
List<LocationInfo> locations;
public LocationsAdapter(Context context, int layourResourceId,
List<LocationInfo> locations) {
super(context, layourResourceId, locations);
this.context = context;
this.layourResourceId = layourResourceId;
this.locations = locations;
}
@Override
public View getView(int position, View row, ViewGroup parent) {
LocationItemHolder holder = null;
if (row != null && ((SoftReference<LocationItemHolder>) row.getTag()).get() != null) {
holder = (LocationItemHolder) ((SoftReference<LocationItemHolder>) row.getTag()).get();
} else {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layourResourceId, parent, false);
holder = new LocationItemHolder();
holder.imgMarker = (ImageView) row.findViewById(R.id.imgMarker);
holder.txtNameStreet = (TextView) row
.findViewById(R.id.txtNameStreet);
holder.txtRegion = (TextView) row.findViewById(R.id.txtRegion);
row.setTag(new SoftReference<LocationItemHolder>(holder));
}
LocationInfo location = locations.get(position);
holder.imgMarker.setImageResource(location.getMarkerId());
holder.txtNameStreet.setText(location.getNameStreet());
holder.txtRegion.setText(location.getRegion());
return row;
}
class LocationItemHolder {
ImageView imgMarker;
TextView txtNameStreet;
TextView txtRegion;
}
}
私は物事を可能な限り効率的にすることに非常に興味があります。コードは私が望むものを作っていますが、SoftReference クラスをうまく利用しているかどうかはわかりません。たとえば、(LocationItemHolder) ((SoftReference ) row.getTag ()).get()という文は、メソッド getView が呼び出されるたびに目的のオブジェクトを取得するために呼び出されるメソッドの数が原因で、キャッシュが無効になると思います。また、複数のキャストが必要です。その文はキャッシュを非効率にすることができますか?. Android のアダプタのコンテキストで SoftReference を使用することをお勧めしますか?
回答ありがとうございます:D