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