Hi zusammen.
Ich habe folgendes Problem: In einer Listview benutze ich einen SimpleCursorAdapter mit einem Cursor mit Ergebnissen einer SQLite Query.
Ich lösche im Context Menu das angeklickte item aus der Datenbank. Das Löschen funktionert auch, jedoch wird die View trotz explizitem Aufruf von runQueryOnBackgroundThread und notifyDataSetChanged nicht refreshed.
Bitte um Hilfe. Hier ist der zugehörige Quellcode:
//EDIT: habe das Problem gelöst. Siehe quellcode in onContextItemSelected
Java
/**
*
*/
package de.trackspace.android.activities;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.AdapterContextMenuInfo;
import de.trackspace.android.utility.TrackspaceDatabase;
/**
* @author primedape
*
*/
public class TrackManager extends ListActivity {
private static final int MENU_DOWNLOAD = 0;
private static final int MENU_HELP = 1;
private static final int CTX_LOAD = 0;
private static final int CTX_DELETE = 1;
TrackspaceDatabase db;
Cursor tracksCursor;
SimpleCursorAdapter adapter;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
db = TrackspaceDatabase.getInstance();
tracksCursor = db.getTracksCursor();
startManagingCursor(tracksCursor);
adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, tracksCursor,
new String[] { TrackspaceDatabase.KEY_TRACK_NAME },
new int[] { android.R.id.text1 });
setListAdapter(adapter);
registerForContextMenu(getListView());
}
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
// Cursor c = tracksCursor;
// c.moveToPosition(position);
Intent i = new Intent(this, TrackInfoView.class);
i.putExtra(TrackspaceDatabase.KEY_ROWID, id);
startActivity(i);
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, CTX_LOAD, 0, "Auf Karte laden");
menu.add(0, CTX_DELETE, 1, "Löschen");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case CTX_LOAD:
// TODO: load on map
return true;
case CTX_DELETE:
long id = ((AdapterContextMenuInfo)item.getMenuInfo()).id;
if (!db.deleteTrack(id)) {
AlertDialog alert = new AlertDialog.Builder(this).setMessage(
"Fehler beim löschen des Tracks").setCancelable(false)
.setTitle("Fehler").setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int id) {
dialog.dismiss();
}
}).create();
alert.show();
}
else {
/*EDIT alter Quellcode: * adapter.runQueryOnBackgroundThread(null);
* adapter.notifyDataSetChanged(); */
//EDIT: Neuer Quellcodeadapter.getCursor().requery();
}
return true;
}
return super.onContextItemSelected(item);
}
public boolean onPrepareOptionsMenu(Menu menu) {
menu.clear();
menu.add(0, MENU_DOWNLOAD, 0, "Tracks herunterladen");
menu.add(0, MENU_HELP, 0, "Hilfe");
return true;
}
/* Handles item selections */
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_DOWNLOAD:
Intent intent = new Intent(this, DownloadTrackView.class);
startActivity(intent);
return true;
// case MENU_HELP:
// //TODO show help window
// return true;
}
return false;
}
}
Alles anzeigen