Ich verwende UIL, um Bilder in einer Listview zu laden.Wie erzwingen Sie eine Cache-Löschung mit Universal Image Loader Android?
Wenn ich ein Bild lange in der Listenansicht drücke, blicke ich auf einen Dialog, um das Bild zu ändern und es durch ein neues zu ersetzen.
Wenn ich ein neues Bild mache, wenn der Dialog geschlossen wird, zeigt meine Listview immer noch das alte Bild (da es zwischengespeichert ist). Wenn ich meine Anwendung schließe und neu starte, wenn ich zu meinem Listenansicht gehe, ist das neue Bild korrekt dort. obwohl entfernen .cacheInMemory()
alles funktioniert
// 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);
Wenn ich:
Dies ist, wie ich UIL eingerichtet. Ich frage mich nur, ob ich den Cache löschen kann, wenn ich nur meinen Dialog öffne. Ich habe versucht, den ausgewählten ImageView zu erreichen und myImageView.invalidate()
aufzurufen, wenn ich den Dialog ohne Erfolg öffne.
// Load and display image asynchronously
imageLoader.displayImage(file_prefix + image_path, image);
Irgendwelche Vorschläge:
werden die Bilder aus einer Datei geladen?
Edit: Code, um ein Kontextmenü zu erstellen, wenn lange ein Bild drücken, habe ich versucht, es den Cache zu löschen:
@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);
}
Wenn ein Menüpunkt (bearbeiten oder löschen) ausgewählt ist
@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
Edit: Code Liste der Bilder angezeigt werden
@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
Ich habe versucht, es funktioniert nicht. Ich öffne ein Kontextmenü, dann einen Dialog. Ich habe diese Zeilen zu meinem 'onCreateContextMenu' hinzugefügt, aber es macht nichts. Ich habe auch versucht, die Bild-URL an den Dialog zu übergeben und den Cache von dort zu befreien, um den imageLoader Singleton zu erhalten, immer noch derselbe. – Mirko
Rufen Sie '' 'imageLoader.displayImage (file_prefix + image_path, image);' '' nach dem Ersetzen des Bildes durch ein neues mit der Kamera auf? – NOSTRA
eigentlich vor, beim Öffnen des Dialogs – Mirko