Android: обновить ListView с помощью ListAdapter и SimpleCursorAdapter - PullRequest
3 голосов
/ 25 февраля 2011

Я пытаюсь обновить 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. Подобные вопросы о stackoverflow и других местах упоминаются с использованием notifyDataSetChanged () иquery (), но ни один из них не является методами ListAdapter или SimpleCursorAdapter.

Ответы [ 4 ]

5 голосов
/ 25 февраля 2011

Я могу обновить 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);

Я не уверен, почему это необходимо, но пока это работает. Если у кого-то есть лучшее решение, я готов попробовать.

0 голосов
/ 29 июня 2016

Вы можете определить адаптер как переменную класса, если к нему нужно получить доступ из других методов того же класса. Затем вы можете позвонить 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;
0 голосов
/ 25 февраля 2011

Метод 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.

0 голосов
/ 25 февраля 2011

В этом случае я рекомендую перейти на пользовательский Adapter, расширив класс BaseAdapter.

...