notifyDataSetChanged() не работает в ListFragment

У меня есть ListView в ListFragment, который заполняется с помощью запроса к базе данных. Он отлично загружает все данные при первом заполнении списка в onCreate(). Но когда я запрашиваю базу данных, присваиваю возвращаемое значение assignmentsCursor и вызываю notifyDataSetChanged(), она не обновляет adapter.mCursor. Если я перехожу в режим отладки в Eclipse, я вижу, что assignmentsCursor.mCount изменился, но когда я смотрю на adapter.mCursor.mCount, он такой же, как и раньше. (Да, я проверяю после вызова метода notifyDataSetChanged().)

Соответствующие части моего кода:

SimpleCursorAdapter adapter;
Cursor assignmentsCursor;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState != null) {
        course = savedInstanceState.getShort(Values.ASSIGNMENT_KEY_COURSE);
    }
    setRetainInstance(true);

    // Create and array to specify the fields we want
    String[] from = new String[] { Values.KEY_TITLE, Values.ASSIGNMENT_KEY_COURSE };

    // and an array of the fields we want to bind in the view
    int[] to = new int[] { R.id.assignment_list_title, R.id.assignment_list_course };

    // Need to give assignmentsCursor a value -- null will make it not work
    updateAdapter();

    adapter = new SimpleCursorAdapter(context, R.layout.assignment_list_item, assignmentsCursor, from, to);
    setListAdapter(adapter);
}

public void onResume() {
    super.onResume();
    updateAdapter();
    refresh();
}

/**
 * Updates the content in the adapter.
 */
public void updateAdapter() {
    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
    boolean showingCompleted = sharedPrefs.getBoolean(Values.ASSIGNMENT_KEY_SHOWING_COMPLETED, false);

    if (course < 0) // Showing assignments from all courses
        if (showingCompleted)
            assignmentsCursor = DbUtils.fetchAllAssignments(context, Values.ASSIGNMENT_LIST_FETCH, null, true);
        else
            assignmentsCursor = DbUtils.fetchIncompleteAssignments(context, Values.ASSIGNMENT_LIST_FETCH, null, true);
    else // Showing assignments from specified course
        if (showingCompleted)
            assignmentsCursor = DbUtils.fetchAllAssignments(context, Values.ASSIGNMENT_LIST_FETCH, course, true);
        else
            assignmentsCursor = DbUtils.fetchIncompleteAssignments(context, Values.ASSIGNMENT_LIST_FETCH, course, true);

}

private void refresh() {
    updateAdapter();
    adapter.notifyDataSetChanged();
}

Помоги мне!! ;)

P.S. Если вам нужна дополнительная информация/код, просто дайте мне знать. Я уверен, что база данных запрашивает правильно.


person mightimaus    schedule 27.03.2012    source источник
comment
Новый курсор создан, но никогда не используется. адаптер.changeCursor(...?   -  person Deucalion    schedule 27.03.2012
comment
Да, я думаю, это было бы так, как вы это делаете! Я искал setCursor(), но я думаю, что changeCursor() будет тем, что я ищу! Я чувствую себя таким глупым. (пощечина) Огромное спасибо!   -  person mightimaus    schedule 29.03.2012


Ответы (1)


Благодаря Deucalion я определил, что неправильно предположил, что адаптер ссылается на переменнуюassignsCursor, а не создает копию Cursor для себя. Что мне нужно было сделать, так это просто вызвать adapter.changeCursor(assignmentsCursor), чтобы он обновил свою локальную копию. Еще раз спасибо, Девкалион!

person mightimaus    schedule 29.03.2012