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

标签 android android-fragments android-loadermanager android-loader android-recyclerview

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

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

我有 2 个表,例如 this .首先,我从 student_course 表中获取 cursor,然后从该 cursor 中获取特定类(class)的学生 ID。然后使用第一个 cursor 的数据,我从 students 表中得到第二个 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是同类同学。

1) 可能是什么问题? 2)里面有没有办法实现LoaderManager类

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

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

最佳答案

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

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

关于Fragment 中的 Android RecyclerView 未更新加载程序内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29168805/

相关文章:

android - 内容显示在 android studio 的预览中,但不显示在 android jetpack compose 的移动设备中

Java MappedByteBuffer.get() 出奇的慢

带有选项卡的 Android ViewPager 在屏幕旋转后不保持状态

java - fragment 在两 Pane 平板电脑模式下未正确显示

android - Loader 和 LoaderManager - 如何判断加载是否出错

Android:CursorLoader 在非最顶层的 Fragment 上崩溃

android - 由 : java. lang.reflect.InvocationTargetException 引起

android - 路径上的 ObjectAnimator 无法在 Marshmallow 上运行?

android - 在选项卡中滑动时如何避免 onCreateView()

android - Android 中数据和 UI 之间松散耦合的最佳实践 - Adapter、Filter、CursorLoader 和 ContentProvider