Podgląd listy nie jest aktualizowany po aktualizacji bazy danych i adapter.notifyDataSetChanged ();

Przeglądałem sieć przez 2 dni i wypróbowałem wiele rzeczy, ale nie mogę zrozumieć, co jest z tym nie tak.

Nadal jestem całkiem nowy w rozwoju Androida, więc prawdopodobnie przegapiłem coś oczywistego.

Mam aplikację, która używa bazy danych sqllite do przechowywania niektórych danych i dla tego dowodu koncepcji wyświetlającego to w widoku listy. Mogę dodawać elementy do listy, usuwać je.

Jak na razie dobrze. Mam problem, gdy zamiast usunąć aktualizuję kolumnę w bazie danych o nazwie „usunięte” i ustawiam ją na 1, a następnie na adapter, aby zaktualizować listę. Wydaje się, że to nie działa.

Jeśli użyję instrukcji delete, działa. Aktualizuje się i wszystko jest w porządku, ale ja chcę mieć usunięte elementy w bazie danych, ale nie pokazywać ich (Więc w zasadzie „ukrywanie” przedmiotów)

Jeśli sprawdzę bazę danych, sama aktualizacja spowodowała zmiany w kolumnach i wszystko, więc chyba jest to problem z odświeżaniem, ponieważ adapter nie wymaga bazy danych lub czegoś w tym kierunku

Loader Listview:

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

Usuń functon

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

jeśli umieściłem dziennik w funkcji zapytania ContentProvider, w rzeczywistości nie uruchamia się.

Jakieś sugestie, jak to rozgryźć?

Jeśli używamadapter.swapCursor(cursor); działa dobrze, po prostu nie wiem, czy jest to właściwy sposób.

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 za pomoc

questionAnswers(2)

yourAnswerToTheQuestion