0

データベースクエリを介して入力された がありますListViewListFragmentのリストに最初に入力するときに、すべてのデータを問題なくロードします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();
}

助けて!!;)

PSさらに詳細/コードが必要な場合は、お知らせください。ただし、データベースが正しくクエリを実行していることは確かです。

4

1 に答える 1

1

Deucalionのおかげで、アダプターがカーソルのコピーを作成するのではなく、assignmentsCursor変数を参照していると誤って想定したと判断しました。私がする必要があるのはadapter.changeCursor(assignmentsCursor)、ローカルコピーを更新するように呼び出すだけでした。再びDeucalionに感謝します!

于 2012-03-29T07:19:48.580 に答える