Listenansicht wird nach Datenbankaktualisierung und adapter.notifyDataSetChanged () nicht aktualisiert;

Ich habe schon 2 Tage im Internet gestöbert und eine Menge Sachen ausprobiert, kann aber nicht herausfinden, was daran falsch ist.

Ich bin noch ziemlich neu in der Android-Entwicklung, daher habe ich wahrscheinlich etwas Offensichtliches verpasst.

Ich habe eine App, die eine SQLite-Datenbank zum Speichern einiger Daten und zum Zweck dieses Proof of Concept zum Anzeigen dieser Daten in einer Listenansicht verwendet. Ich kann der Liste Elemente hinzufügen und sie löschen.

So weit, ist es gut. Das Problem, das ich habe, ist, wenn ich anstatt zu löschen, eine Spalte in der Datenbank mit dem Namen "gelöscht" aktualisiere und auf 1 setze und dann den Adapter zum Aktualisieren der Liste habe. Es scheint nicht zu funktionieren.

Wenn ich die delete-Anweisung verwende, funktioniert es. Es wird aktualisiert und alles ist in Ordnung, aber ich möchte die gelöschten Elemente in der Datenbank haben, aber nicht anzeigen (also im Grunde "verstecken" Elemente)

Wenn ich die Datenbank überprüfe, hat das Update selbst die Spaltenänderungen und alles bestanden, so dass ich vermute, dass es ein Aktualisierungsproblem ist, da der Adapter die Datenbank oder etwas in dieser Richtung nicht neu abfragt

Listview Loader:

public void fillData() {

    if(lw.getAdapter() == null){
        // Fields from the database (projection)
        // Must include the _id column for the adapter to work
        String[] from = new String[] { TodoTable.COLUMN_SUMMARY, TodoTable.COLUMN_ID};
        String where = TodoTable.COLUMN_DELETED + " = ?";


        Cursor cursor = getContentResolver().query(TodoContentProvider.CONTENT_URI,from,where,new String[] {"0"},null);
        // Fields on the UI to which we map
        int[] to = new int[] { R.id.label };

        adapter = new SimpleCursorAdapter(this, R.layout.todo_row, cursor, from,
                to, 0);
        Log.v("Count",Integer.toString(cursor.getCount()));
        lw.setAdapter(adapter);
    }
    else
        adapter.notifyDataSetChanged();
    }

Löschfunktion

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case DELETE_ID:
            /* Code for actual delete
            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
                    .getMenuInfo();
            Uri uri = Uri.parse(TodoContentProvider.CONTENT_URI + "/"
                    + info.id);
            getContentResolver().delete(uri, null, null);
            fillData();
            */

            /* Code for update and hide */
            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
                    .getMenuInfo();
            Uri uri = Uri.parse(TodoContentProvider.CONTENT_URI + "/"
                    + info.id);
            ContentValues values = new ContentValues();
            values.put(TodoTable.COLUMN_DIRTY, 1);
            values.put(TodoTable.COLUMN_DELETED, 1);
            getContentResolver().update(uri,values,null,null);
            fillData();
            return true;
    }
    return super.onContextItemSelected(item);
}

Wenn ich der Abfragefunktion des ContentProviders ein Protokoll hinzufüge, wird es tatsächlich nicht ausgelöst.

Irgendwelche Vorschläge, wie man das herausfindet?

Wenn ich benutzeadapter.swapCursor(cursor); Es funktioniert gut, weiß nur nicht, ob dies der richtige Weg ist.

public void fillData() {

    // Fields from the database (projection)
    // Must include the _id column for the adapter to work
    String[] from = new String[] { TodoTable.COLUMN_SUMMARY, TodoTable.COLUMN_ID};
    String where = TodoTable.COLUMN_DELETED + " = ?";

    Cursor cursor = getContentResolver().query(TodoContentProvider.CONTENT_URI,from,where,new String[] {"0"},null);

    // Fields on the UI to which we map
    int[] to = new int[] { R.id.label };

    if(lw.getAdapter() == null){
        adapter = new SimpleCursorAdapter(this, R.layout.todo_row, cursor, from,
                to, 0);
        Log.v("Count",Integer.toString(cursor.getCount()));
        lw.setAdapter(adapter);
    }
    else
    {
        adapter.swapCursor(cursor);
    }
}

Ty für die Hilfe

Antworten auf die Frage(2)

Ihre Antwort auf die Frage