UILを使用してリストビューに画像を読み込みます。
リストビューで画像を長押しすると、その画像を変更するダイアログが表示され、カメラを使用して新しい画像に置き換えます。
新しい写真を撮った場合、ダイアログが閉じられても、リストビューには古い画像が表示されます(キャッシュされているため)。リストビューに移動したときにアプリケーションを閉じて再起動すると、新しい画像が正しく表示されます。
これが私がUILを設定する方法です:
_// Get singletone instance of ImageLoader
imageLoader = ImageLoader.getInstance();
//set display options for image loader
DisplayImageOptions displayOptions = new DisplayImageOptions.Builder()
.cacheInMemory()
.displayer(new FadeInBitmapDisplayer(500)) //fade in images
.resetViewBeforeLoading()
.build();
//set image loader options
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this).defaultDisplayImageOptions(displayOptions).build();
// Initialize ImageLoader with configuration.
imageLoader.init(config);
_
.cacheInMemory()
を削除すると、すべてが機能します。ダイアログを開くときにのみキャッシュをクリアできるかどうか疑問に思っています。 ImageViewを選択して保持し、ダイアログを開くときにmyImageView.invalidate()
を呼び出そうとして失敗しました。
画像はファイルからロードされます:
_// Load and display image asynchronously
imageLoader.displayImage(file_prefix + image_path, image);
_
助言がありますか?
編集:画像を長押ししたときにコンテキストメニューを作成するコード、そこでキャッシュをクリアしようとしました:
_@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//get info about item selected
AdapterView.AdapterContextMenuInfo info;
try {
// Casts the incoming data object into the type for AdapterView objects.
info = (AdapterView.AdapterContextMenuInfo) menuInfo;
} catch (ClassCastException e) {
// If the menu object can't be cast, logs an error.
Log.e("no info", "bad menuInfo", e);
return;
}
Cursor cursor = (Cursor) getListAdapter().getItem(info.position);
if (cursor == null) {
// For some reason the requested item isn't available, do nothing
return;
}
//remove selected image from cache (if it is an image)
imageUrl = cursor.getString(cursor.getColumnIndex("image_path"));
if (!imageUrl.equalsIgnoreCase("")) {
MemoryCacheUtil.removeFromCache(imageUrl, imageLoader.getMemoryCache());
}
Log.i("imageUrl", imageUrl);
//get defect row ID and text content to pass it to defect activity
defect_row_id = cursor.getLong(cursor.getColumnIndex("_id"));
defect_txt = cursor.getString(cursor.getColumnIndex("defect"));
MenuInflater inflater = getMenuInflater();
Log.i("cursor", DatabaseUtils.dumpCursorToString(cursor));
//set project identifier in context menu header, mapping cursor sequence of values
menu.setHeaderTitle(getString(R.string.select_an_option));
inflater.inflate(R.menu.menu_defect_row, menu);
}
_
メニュー項目(編集または削除)を選択した場合
_@Override
public boolean onContextItemSelected(MenuItem item) {
//AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.edit:
//open defect activity with the specified image and defect pre-loaded
Intent editDefectIntent = new Intent(this, DefectActivity.class);
editDefectIntent.putExtra("defect_row_id", defect_row_id);
editDefectIntent.putExtra("imageUrl", imageUrl);
startActivity(editDefectIntent);
return true;
case R.id.delete:
askDeleteConfirm();
return true;
default:
return false;
}
}//onContextItemSelected
_
編集:画像のリストを表示するコード
_@Override
public void onResume() {
super.onResume();
//open connection to db
db = new DBAdapter(this);
db.open();
Log.i("DefectListActivity -> onResume", "called");
// get all defects for this unit
defectList = db.getAllDefectsByUnit(unit_id);
// create an array adapter and let it to display our row
defects = new SimpleCursorAdapter(this, R.layout.defect_row, defectList, new String[] { "defect", "image_path" }, new int[] { R.id.defect, R.id.image }, 0);
//set custom view using ViewBinder
SimpleCursorAdapter.ViewBinder binder = new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
int placeholder_id = getResources().getIdentifier("placeholder", "drawable", getPackageName());
//get column name
String name = cursor.getColumnName(columnIndex);
//for the thumbnail column,if we have an image replace the placeholder
if ("image_path".equals(name)) {
ImageView image = (ImageView) view.findViewById(R.id.image);
//Bitmap thumbnail;
String image_path = cursor.getString(columnIndex);
Log.i("image_path ->", image_path);
if (!image_path.equalsIgnoreCase("")) {
// Load and display image asynchronously
imageLoader.displayImage(file_prefix + image_path, image);
} else {
image.setImageResource(placeholder_id);
}
return true;
}
//for the defect column, just add the text to the view
if ("defect".equals(name)) {
String defect_text = cursor.getString(columnIndex);
TextView defect_holder = (TextView) view.findViewById(R.id.defect);
defect_holder.setText(defect_text);
return true;
}
return false;
}
};
defects.setViewBinder(binder);
setListAdapter(defects);
}//onResume
_
たとえば、メモリとディスクの両方にキャッシュしている場合:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
.discCache(new UnlimitedDiscCache(cacheDir))
.........
両方から削除してから、画像ビューを再読み込みしてください。
MemoryCacheUtils.removeFromCache(url, ImageLoader.getInstance().getMemoryCache());
DiscCacheUtils.removeFromCache(url, ImageLoader.getInstance().getDiscCache());
これは機能するはずです:
imageLoader.clearMemoryCache();
ダイアログを開くときは、メモリキャッシュにキャッシュされた画像を削除する必要があると思います。そのためにはMemoryCacheUtil
を使用します。
MemoryCacheUtils.removeFromCache(imageUrl, imageLoader.getMemoryCache());