Как удалить последний элемент списка и правильно обновить вид? - PullRequest
0 голосов
/ 28 февраля 2012

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

1 Ответ

1 голос
/ 28 февраля 2012

Простая причина возникновения этой проблемы:

для домашней работы:

Функция:

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

См. разницу в обоих.

В 1-й вы запускаете код для всего, что вы получаете в курсор (пустой курсор или заполненный курсор) и устанавливаете адаптер.

Где на втором этапе вы проверяете условие, что если курсор не равен нулю, то только вы сбрасываете адаптер в listview. Так что, когда вы удаляете последний элемент из таблицы, в нем нет записи, в результате чего курсор становится пустыми, следовательно, ваш новый адаптер (с пустым курсором) никогда не будет установлен на ваш просмотр списка.

Чтобы преодолеть, добавьте эту строку в метод 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); 

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...