2012-02-28 126 views
0

「Gelöscht」是指「已刪除」的英文...... 「Löschen」在英語中的意思是「刪除」 ......如何刪除列表視圖的最後一項並正確刷新視圖?

一切工作中homework.java但不是在第二部分(mark.java)。那麼爲什麼它不在mark.java中工作,但在這裏呢?這就像同樣的代碼...

我有它的功課一個ListView喜歡你可以看到:(homework.java)

Pic 1

當我刪除的最後一個項目它刷新正確:

Pic 2 Pic 3

如果 「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)

Pic 4 Pic 5 Pic 6

如果 「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

你從哪兒列表視圖刪除一個項目,你應該重新填充的ListView。這是實現你想要的一個好方法。 – Hiral 2012-02-28 10:24:50

+2

做過U與listView.invalidate()嘗試? – 2012-02-28 10:30:07

+0

@PadmaKumar是的,我做了...它沒有工作。我想知道爲什麼它在homework.java和mark.java中工作不是......謝謝! – 2012-02-28 12:29:49

回答

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); 
    } 
} 

見兩個的區別。

在第一個中,您爲代碼運行任何您進入遊標(空遊標或實心遊標)的代碼並設置適配器。

在第二個地方,檢查條件,如果光標不爲空,那麼只有您將適配器重置爲listview。因此,當您從表中刪除最後一項時,沒有記錄導致光標爲空,因此您的新適配器(帶有空遊標)將永遠不會設置爲您的列表視圖。

爲了克服這一行添加到您的標記的fillData()方法,如:通過列表項的delete語句後再次settting其適配器

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); 

    } 
} 
+0

謝謝千次:D這解決了我的問題。我沒有關心我的if條款。謝謝! – 2012-02-28 13:06:28

+1

@MarcoSeiz:很高興幫助:) – Hiral 2012-02-28 13:07:09

相關問題