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;
Другие вопросы по тегам