Android: обновить ListView с помощью ListAdapter и SimpleCursorAdapter
Я пытаюсь обновить ListView, который использует ListAdapter, созданный как SimpleCursorAdapter.
Вот мой код для создания Cursor и ListAdapter в onCreate, который заполняет ListView.
tCursor = db.getAllEntries();
ListAdapter adapter=new SimpleCursorAdapter(this,
R.layout.row, tCursor,
new String[] columns,
new int[] {R.id.rowid, R.id.date});
setListAdapter(adapter);
Затем я добавляю некоторые данные в базу данных другим методом, но не могу понять, как обновить ListView. Подобные вопросы о stackru и других местах упоминаются с использованием notifyDataSetChanged() и query(), но ни один из них не является методами ListAdapter или SimpleCursorAdapter.
4 ответа
Я могу обновить ListView, создав новый адаптер и снова вызвав setListAdapter.
Я назвал его адаптер2 в другом методе.
tCursor = db.updateQuery();
ListAdapter adapter2=new SimpleCursorAdapter(this,
R.layout.row, tCursor,
columns,
new int[] {R.id.rowid, R.id.date});
setListAdapter(adapter2);
Я не уверен, почему это необходимо, но пока это работает. Если у кого-то есть лучшее решение, я готов попробовать.
В этом случае я рекомендую пойти с кастомной Adapter
, расширяя BaseAdapter
учебный класс.
Метод notifyDataSetChanged
исходит от SimpleCursorAdapter
родительский класс BaseAdapter
, Родитель реализует ListAdapter
и вы должны быть в состоянии передать его вашему ListView
,
Пытаться:
tCursor = db.getAllEntries();
BaseAdapter adapter=new SimpleCursorAdapter(this,
R.layout.row, tCursor,
new String[] columns,
new int[] {R.id.rowid, R.id.date});
setListAdapter(adapter);
Тогда вы должны быть в состоянии использовать notifyDataSetChanged
,
Вы можете определить адаптер как переменную класса, если к нему нужно получить доступ из других методов того же класса. Тогда вы можете позвонить changeCursor()
обновить ListView.
public class mainActivity extends AppCompatActivity {
// Define the Cursor variable here so it can be accessed from the entire class.
private SimpleCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_coordinator_layout)
// Get the initial cursor
Cursor tCursor = db.getAllEntries();
// Setup the SimpleCursorAdapter.
adapter = new SimpleCursorAdapter(this,
R.layout.row,
tCursor,
new String[] { "column1", "column2" },
new int[] { R.id.rowid, R.id.date },
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
// Populate the ListAdapter.
setListAdapter(adapter);
}
protected void updateListView() {
// Get an updated cursor with any changes to the database.
Cursor updatedCursor = db.getAllEntries();
// Update the ListAdapter.
adapter.changeCursor(updatedCursor);
}
}
Если представление списка необходимо обновить из методов другого класса, переменная адаптера должна быть объявлена public static
вместо
public static SimpleCursorAdapter adapter;