Android Fragment 中的 RecyclerView 未更新加载程序内容

Android RecyclerView inside Fragment is not updating Loader content

我有 Fragment,它使用 RecyclerView AdapterLoaderManager 来列出项目。 RecyclerView 我使用的是这个 address. 我在 Fragment 中实现了 LoaderManager 并将其 Activity 的上下文提供给 RecyclerView

当我将新项目添加到列表时,它不会刷新并在列表中显示新项目。我在另一个 activity 上使用相同的 Adapter 和结构,效果很好。但是在这里我在 Fragment 中使用 RecyclerViewLoader 并且当我添加项目时它不会刷新列表,而是我必须返回(完成片段)并再次输入。

我有 2 个 table 像 。首先,我从 student_course table 得到 cursor,然后从 cursor 得到特定 class 的学生 ID。然后使用第一个 cursor 的数据,我从 students table 得到第二个 cursor,其中包含来自相同 class 的学生列表。然后我将第二个 cursor 发送到 adapter。我对 onCreateView()onCreateLoader 都进行了以下操作:

String[] projection0 = {
            DatabaseOpenHelper.COL_STUDENT_ID,
            DatabaseOpenHelper.COL_COURSE_ID};
    String selection0=DatabaseOpenHelper.COL_COURSE_ID + "=?";
    String selectionArgs0[]={String.valueOf(courseId)};
    mDataset0=getActivity().getContentResolver().query(StudentContentProvider.CONTENT_URI2, projection0,selection0,selectionArgs0,null);


    if(mDataset0.getCount()!=0) {
        //BATCH
        List<String> selectionList = new ArrayList<String>();
        mDataset0.moveToFirst();

        ...
        String[] projection1 = {
                DatabaseOpenHelper.COLUMN_ID,
                DatabaseOpenHelper.COL_STUDENT_NUMBER,
                DatabaseOpenHelper.COL_STUDENT_NAME,
                DatabaseOpenHelper.COL_STUDENT_CARD_ID,
                DatabaseOpenHelper.COL_STUDENT_COLOR};
        selection1 = selection1.substring(0, selection1.length() - 2) + ")";
        mDataset1 = getActivity().getContentResolver().query(StudentContentProvider.CONTENT_URI1, projection1, selection1, selectionArgs1, null);

    }else{
        mDataset1=null;
    }
...
mAdapter = new studentListAdapter(getActivity(),mDataset1,this);

mDataset1 是同 class 的学生。

1) 可能是什么问题? 2)里面有没有实现LoaderManagerclass的方法

更新 1: 当我将 selection1selectionArgs1 更改为 null 时,它会在我添加项目后立即更新列表。但它显示了每个 class 的所有学生,因为我没有指定选择。

更新 2: 当我检查 onLoadFinished() 时,我看到新光标在加载新内容后仍然与旧光标相同。

1) 我意识到添加新数据时光标没有改变,所以当我添加新数据时我调用 getLoaderManager().restartLoader(LOADER_ID,null,this)(通过 localBrodCastManager在我的例子中)重新加载光标(调用 onCreateLoader())并且新数据显示在列表中。 (如建议 here)。这确实有技巧。

2) 我发现添加项目时 cursor 的原因没有改变,因为在 onCreateLoader() 我返回了 cursor具体 id 选择学生,这意味着 cursor 不会改变,直到我给出的具体 ids 项目发生变化。因此,如果添加了新项目,我的 cursor 不会更改,但如果删除或更改了其中一项(列出的),则会更改光标。解决方案是 .