Android: Datenbank Löschen Zeile aus der Liste anzeigen Tippen Sie lange auf
Bin ich eine Anwendung erstellen, in der ich bin das Auffüllen der Daten aus der Datenbank in die listview meiner Tätigkeit. Nun, auf longItemClick Hörer die ich löschen möchte, diesen Wert aus der Datenbank und aktualisieren Sie meine listview in der app.
Hier mein code für longClickListener auf die listview:
private ListView showing_history;
private ListAdapter mHistoryListAdapter;
private ArrayList<SearchHistoryDetails> searchArrayList;
private ArrayList<SearchHistoryDetails> HistoryObjArrayList;
mHistoryListAdapter = new ArrayAdapter<String>(this,
R.layout.mylistlayout, populateList());
showing_history.setAdapter(mHistoryListAdapter);
HistoryObjArrayList = new ArrayList<SearchHistoryDetails>();
/**
* Long tap on listview to delete the selected item from the history
* list.
* */
showing_history
.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0,
View arg1, int arg2, long arg3) {
final AlertDialog.Builder b = new AlertDialog.Builder(
MainActivity.this);
b.setIcon(android.R.drawable.ic_dialog_alert);
b.setMessage("Delete this from history?");
b.setPositiveButton("Yes",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
Toast.makeText(getApplicationContext(),
"Yes", Toast.LENGTH_LONG)
.show();
}
});
b.setNegativeButton("No",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
dialog.cancel();
}
});
b.show();
return true;
}
});
Durch diesen code bin ich beim einfügen der Daten in die Datenbank:
/**
* Inserting the string when user searches for anything into the database.
* */
public void insertHistory(SearchHistoryDetails paraHistoryDetailsPojoObj) {
AndroidOpenDbHelper androidOpenDbHelperObj = new AndroidOpenDbHelper(
this);
SQLiteDatabase sqliteDatabase = androidOpenDbHelperObj
.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(AndroidOpenDbHelper.COLUMN_NAME_HISTORY_STRING,
paraHistoryDetailsPojoObj.getHistoryName());
@SuppressWarnings("unused")
long affectedColumnId = sqliteDatabase.insert(
AndroidOpenDbHelper.TABLE_NAME_HISTORY, null, contentValues);
sqliteDatabase.close();
}
Hier ist der code, von dem ich das abrufen von Daten aus der Datenbank und repopulating es in der Ansicht Liste:
public List<String> populateList() {
List<String> HistoryNamesList = new ArrayList<String>();
AndroidOpenDbHelper openHelperClass = new AndroidOpenDbHelper(this);
SQLiteDatabase sqliteDatabase = openHelperClass.getReadableDatabase();
Cursor cursor = sqliteDatabase
.query(AndroidOpenDbHelper.TABLE_NAME_HISTORY,
new String[] { AndroidOpenDbHelper.COLUMN_NAME_HISTORY_STRING },
null, null, null, null, AndroidOpenDbHelper.ID
+ " DESC");
startManagingCursor(cursor);
while (cursor.moveToNext()) {
String ugName = cursor
.getString(cursor
.getColumnIndex(AndroidOpenDbHelper.COLUMN_NAME_HISTORY_STRING));
SearchHistoryDetails histPojoClass = new SearchHistoryDetails();
histPojoClass.setHistoryName(ugName);
searchArrayList.add(histPojoClass);
HistoryNamesList.add(ugName);
}
sqliteDatabase.close();
int history_db = cursor.getCount();
if (history_db == 0) {
history_layout.setVisibility(LinearLayout.GONE);
} else {
history_layout.setVisibility(LinearLayout.VISIBLE);
}
return HistoryNamesList;
}
Abrufen und einfügen von Daten alle Dinge sind perfekt, aber das löschen einer bestimmten Zeile ist nicht für mich arbeiten. Jetzt habe ich schon einige action mit toast und es funktioniert, was soll ich tun, damit die Datenbank-Daten-updates nach dem löschen der Zeile aus der listview. Bitte geben Sie mir eine Idee um dieses problem zu überwinden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, diese..,.
und in der Klasse DatabaseHandler
list.remove(position);
gibt mir eine Fehlermeldung, und wenn ich es geändertlist.removeViewAt(position);
war ich immer force close, mit Fehler **11-15 10:15:10.484: E/AndroidRuntime(11889): java.lang.UnsupportedOperationException: removeViewAt(int) wird nicht unterstützt, in AdapterView **. Haben Sie eine Idee, über diese?11-15 13:04:17.593: E/AndroidRuntime(18317): Caused by: java.lang.NullPointerException
auf onCreate()11-15 13:04:17.593: E/AndroidRuntime(18317): at com.search.MainActivity.onCreate(MainActivity.java:461)
. Irgendeine Idee, warum dies geschieht, hat sich erledigt all die Dinge, wie Sie vorgeschlagen.private List<String> HistoryNamesList;
, lief ohne Fehler. Aber nichts entfernt wird, habe ich meine app neu gestartet und die onCreate-Methode aufgerufen um die Liste zu füllen. Alle Listenelemente werden als es ist.richtige Lösung ist die Verwendung Lader.. vor allem CursorLoader zusammen mit Content-Anbieter.
Wenn der Content-Provider ist ein overkill für das, was Sie zu tun versuchen CursorLoader von commonsware. Das update nach dem löschen passiert automatisch und nicht in der ui-thread, das ist gut.
https://github.com/commonsguy/cwac-loaderex.. es ist ziemlich einfach, sobald Sie Ihren Kopf um diese.
Allerdings, wenn Sie immer noch wollen, löschen Sie die Zeile, die wie pro Ihre code. Löschen Sie es einfach in Ihre longpress Zuhörer. Aber danach aktualisieren Sie die adapter.
Gewusst wie: aktualisieren Android listview?
Update Liste.. Zuerst die Methode aufrufen, wo Sie angegeben haben, die löschen Abfrage von generator-positiven-Taste.
Danach löschen Sie das Element aus
HistoryNamesList
array-ListeNun die Daten entfernen von Datenbank-und arraylist-aber listview zeigen noch die alten Daten, so dass Sie haben, um Benachrichtigen listview-adapter wie unten gezeigt
adapter.notifyDataSetChanged();
adapter.notifyDataSetInvalidated();
Gelöst!
Änderungen auf onCLick():