Android Fragment 中的 RecyclerView 未更新加载程序内容
Android RecyclerView inside Fragment is not updating Loader content
我有 Fragment,它使用 RecyclerView Adapter
和 LoaderManager
来列出项目。 RecyclerView
我使用的是这个 address. 我在 Fragment 中实现了 LoaderManager
并将其 Activity 的上下文提供给 RecyclerView
。
当我将新项目添加到列表时,它不会刷新并在列表中显示新项目。我在另一个 activity 上使用相同的 Adapter
和结构,效果很好。但是在这里我在 Fragment 中使用 RecyclerView
和 Loader
并且当我添加项目时它不会刷新列表,而是我必须返回(完成片段)并再次输入。
我有 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: 当我将 selection1
和 selectionArgs1
更改为 null
时,它会在我添加项目后立即更新列表。但它显示了每个 class 的所有学生,因为我没有指定选择。
更新 2: 当我检查 onLoadFinished()
时,我看到新光标在加载新内容后仍然与旧光标相同。
1) 我意识到添加新数据时光标没有改变,所以当我添加新数据时我调用 getLoaderManager().restartLoader(LOADER_ID,null,this)
(通过 localBrodCastManager
在我的例子中)重新加载光标(调用 onCreateLoader()
)并且新数据显示在列表中。 (如建议 here)。这确实有技巧。
2) 我发现添加项目时 cursor
的原因没有改变,因为在 onCreateLoader()
我返回了 cursor
具体 id
选择学生,这意味着 cursor
不会改变,直到我给出的具体 ids
项目发生变化。因此,如果添加了新项目,我的 cursor
不会更改,但如果删除或更改了其中一项(列出的),则会更改光标。解决方案是 .
我有 Fragment,它使用 RecyclerView Adapter
和 LoaderManager
来列出项目。 RecyclerView
我使用的是这个 address. 我在 Fragment 中实现了 LoaderManager
并将其 Activity 的上下文提供给 RecyclerView
。
当我将新项目添加到列表时,它不会刷新并在列表中显示新项目。我在另一个 activity 上使用相同的 Adapter
和结构,效果很好。但是在这里我在 Fragment 中使用 RecyclerView
和 Loader
并且当我添加项目时它不会刷新列表,而是我必须返回(完成片段)并再次输入。
我有 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: 当我将 selection1
和 selectionArgs1
更改为 null
时,它会在我添加项目后立即更新列表。但它显示了每个 class 的所有学生,因为我没有指定选择。
更新 2: 当我检查 onLoadFinished()
时,我看到新光标在加载新内容后仍然与旧光标相同。
1) 我意识到添加新数据时光标没有改变,所以当我添加新数据时我调用 getLoaderManager().restartLoader(LOADER_ID,null,this)
(通过 localBrodCastManager
在我的例子中)重新加载光标(调用 onCreateLoader()
)并且新数据显示在列表中。 (如建议 here)。这确实有技巧。
2) 我发现添加项目时 cursor
的原因没有改变,因为在 onCreateLoader()
我返回了 cursor
具体 id
选择学生,这意味着 cursor
不会改变,直到我给出的具体 ids
项目发生变化。因此,如果添加了新项目,我的 cursor
不会更改,但如果删除或更改了其中一项(列出的),则会更改光标。解决方案是