“Gelöscht”在英语中的意思是“删除”... “Löschen”在英语中意为“删除”......
一切都在homework.java中工作,但在第二部分(mark.java)中不起作用。那么为什么它不能在mark.java中运行呢?它就像是相同的代码......
我有一个带有家庭作业的ListView,你可以看到:(homework.java)
当我删除最后一项时,它会正确刷新:
如果触及“Löschen”会发生什么......(CONTEXT_MENU_DELTE_ITEM)
public boolean onContextItemSelected(MenuItem item) {
//Adapterview definieren
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
long id = getListAdapter().getItemId(info.position); //Gibt die ID des gedrückten Items zurück
switch (item.getItemId()) {
case CONTEXT_MENU_DELETE_ITEM: //Wenn die Auswahl auf CONTEXT_MENU_DELETE_ITEM fiel
String id_delete = Long.toString(id); //Die Item ID wird dem String zugewiesen
try {
delItem(id_delete); //Löschen des Items (siehe Funktionen) mit der ID id_delete
Toast.makeText(this, "Gelöscht!", Toast.LENGTH_SHORT).show(); //Anzeige "Gelöscht!"
fillData(); //ListView wieder mit DB Daten füllen
registerForContextMenu(getListView()); //ContextMenu registrieren
}
catch(SQLiteException e){
Toast.makeText(this, "Nicht gelöscht!", Toast.LENGTH_SHORT).show(); //Bei einem Fehler: Nicht gelöscht...
}
return(true);
case CONTEXT_MENU_EDIT_ITEM: //Wenn die Auswahl auf CONTEXT_MENU_EDIT_ITEM fiel
try {
id_edit = Long.toString(id); //Die Item ID wird dem String zugewiesen
mDbHelper.open_database_rw(); //Datenbank wird geöffnet
Cursor cursor = db.query("tbl_homework", new String[] {"hw"}, //Dem Cursor wird der Eintrag "hw" in der Tabelle tbl_homework zugewiesen, welcher die _id vom Item hat
"_id="+id_edit, null, null, null, null);
startManagingCursor(cursor); //Managed den Cursor
cursor.moveToFirst(); //Cursor an den Anfang setzen
int column = cursor.getColumnIndex("hw"); //Der SpaltenIndex in column schreiben
hw = cursor.getString(column); //String in hw schreiben (wird bei den Dialogen wieder benötigt!)
showDialog(EDIT_HW_DIALOG); //EDIT_HW_DIALOG Dialog aufrufen, siehe Dialoge
fillData(); //ListView mit DB Einträgen füllen
}
catch(SQLiteException e){
Toast.makeText(this, "Nicht gelöscht!", Toast.LENGTH_SHORT).show(); //Meldung: Nicht gelöscht, bei Fehler
}
return(true);
}
return(super.onOptionsItemSelected(item)); //Selektierte Item wird zurückgegeben
}
... Funkctions
/** AlertDialog: Fehler-Nachrichten-Funktion */
private void fillData() {
c = mDbHelper.fetchAllNotes(); //Cursor c mit fetchAllNotes von dbHelper.java initialisieren
startManagingCursor(c); //Managed den Cursor
String[] from = new String[] { dbHelper.HOMEWORK_ROW_HW, dbHelper.HOMEWORK_ROW_HWDATE}; //Datenzuweisung dem String from
int[] to = new int[] {R.id.txt_notes_row, R.id.txt_homework}; //Datenzuweisung dem Integer to
//ArrayAdapter deklarieren und anzeigen
SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.show_homework, c, from, to);
setListAdapter(notes);
}
/** delItem: Funktion zum Löschen von einem Datensatz */
public void delItem(String item){
db.delete("tbl_homework", "_id="+item, null); //Datensatz löschen
}
但在我的第二个ListView中,我有一些标记。当我尝试删除那里的最后一个 它已被删除在数据库中(我检查过),但没有像家庭作业那样刷新ListView。我总是要先重启我的活动。但在家庭作业中我不必...... 我的问题是为什么以及如何解决它? (marks.java)
如果触及“Löschen”会发生什么......(CONTEXT_MENU_DELETE_ITEM)
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info= (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
long id = getListAdapter().getItemId(info.position); /*what item was selected is ListView*/
switch (item.getItemId()) {
case CONTEXT_MENU_DELETE_ITEM:
mDbHelper.open_database_rw();
String id_delete = Long.toString(id);
try{
delItem(id_delete);
Toast.makeText(this, "Note gelöscht!", Toast.LENGTH_SHORT).show();
fillData();
registerForContextMenu(getListView());
}
catch(SQLiteException e){
Toast.makeText(this, "Nicht gelöscht!", Toast.LENGTH_SHORT).show();
}
return(true);
case CONTEXT_MENU_EDIT_ITEM:
try{
mDbHelper.open_database_rw();
id_edit = Long.toString(id);
cursor = db.query("tbl_marks", new String[] {"name", "mark", "gewicht"},
"_id="+id_edit, null, null, null, null);
startManagingCursor(cursor);
cursor.moveToFirst();
int name_mark = cursor.getColumnIndex("name");
name = cursor.getString(name_mark);
int mark_mark = cursor.getColumnIndex("mark");
mark = cursor.getString(mark_mark);
int mark_gewicht_int = cursor.getColumnIndex("gewicht");
gewicht_mark = cursor.getString(mark_gewicht_int);
gewicht_mark_int = Integer.parseInt(gewicht_mark);
removeDialog(EDIT_MARK_DIALOG);
showDialog(EDIT_MARK_DIALOG);
registerForContextMenu(getListView());
fillData();
cursor.close();
}
catch(SQLiteException e){
Toast.makeText(this, "Nicht gelöscht!", Toast.LENGTH_SHORT).show();
}
return(true);
}
return(super.onOptionsItemSelected(item));
}
...功能
private void fillData() {
Bundle extras = getIntent().getExtras();
String txt_sub_id = extras.getString("IDFach");
int test = Integer.parseInt(txt_sub_id);
cursor = db.rawQuery("SELECT _id, subid, name, mark, gewicht, datum FROM tbl_marks WHERE subid = '"+test+"';", null);
startManagingCursor(cursor);
if (cursor != null && cursor.moveToFirst()) {
zahl1 = 0;
zahl2 = 0;
int intMark = cursor.getColumnIndex("mark");
int intWeight = cursor.getColumnIndex("gewicht");
do {
float weight = cursor.getFloat(intWeight);
float mark = cursor.getFloat(intMark);
zahl1 = zahl1 + (weight * mark);
zahl2 = zahl2 + weight;
} while (cursor.moveToNext());
cursor.moveToFirst(); //bringing cursor to first place
String[] from = new String[] { dbHelper.MARKS_ROW_NAME, dbHelper.MARKS_ROW_MARK, dbHelper.MARKS_ROW_GEWICHT, dbHelper.MARKS_ROW_DATUM};
int[] to = new int[] {R.id.txt_marks_row, R.id.txt_note, R.id.txt_gewicht, R.id.txt_datum};
txt_durchschnitt = (TextView)findViewById(R.id.txt_durchschnitt);
result = zahl1 / zahl2;
float result_neu = (float) (Math.round(result * 100) / 100.0);
txt_durchschnitt.setText(""+result_neu);
SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.show_marks, cursor, from, to);
setListAdapter(notes);
}
}
public void delItem(String item){
db.delete("tbl_marks", "_id="+item, null);
}
答案 0 :(得分:1)
您遇到此问题很简单:
做作业:
功能是:
private void fillData() {
c = mDbHelper.fetchAllNotes(); //Cursor c mit fetchAllNotes von dbHelper.java initialisieren
startManagingCursor(c); //Managed den Cursor
String[] from = new String[] { dbHelper.HOMEWORK_ROW_HW, dbHelper.HOMEWORK_ROW_HWDATE}; //Datenzuweisung dem String from
int[] to = new int[] {R.id.txt_notes_row, R.id.txt_homework}; //Datenzuweisung dem Integer to
//ArrayAdapter deklarieren und anzeigen
SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.show_homework, c, from, to);
setListAdapter(notes);
}
标记位置:
功能是:
private void fillData() {
Bundle extras = getIntent().getExtras();
String txt_sub_id = extras.getString("IDFach");
int test = Integer.parseInt(txt_sub_id);
cursor = db.rawQuery("SELECT _id, subid, name, mark, gewicht, datum FROM tbl_marks WHERE subid = '"+test+"';", null);
startManagingCursor(cursor);
if (cursor != null && cursor.moveToFirst()) {
//your code
SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.show_marks, cursor, from, to);
setListAdapter(notes);
}
}
看两者的区别。
在第一个中,你运行任何你进入游标的代码(空光标或填充光标)并设置适配器。
在第二个中,你检查条件是如果游标不是null,那么只有你将适配器重置为listview.So当你从表中删除最后一项时,没有记录到它导致游标为空,因此你的新的适配器(带有空光标)永远不会设置为列表视图。
要克服,请将此行添加到标记的fillData()方法中,如:
private void fillData() {
Bundle extras = getIntent().getExtras();
String txt_sub_id = extras.getString("IDFach");
int test = Integer.parseInt(txt_sub_id);
cursor = db.rawQuery("SELECT _id, subid, name, mark, gewicht, datum FROM tbl_marks WHERE subid = '"+test+"';", null);
startManagingCursor(cursor);
if (cursor != null && cursor.moveToFirst()) {
//your code
SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.show_marks, cursor, from, to);
setListAdapter(notes);
}
else
{
String[] from = new String[] { dbHelper.MARKS_ROW_NAME, dbHelper.MARKS_ROW_MARK, dbHelper.MARKS_ROW_GEWICHT, dbHelper.MARKS_ROW_DATUM};
int[] to = new int[] {R.id.txt_marks_row, R.id.txt_note, R.id.txt_gewicht, R.id.txt_datum};
SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.show_marks, cursor, from, to);
setListAdapter(notes);
}
}