Android RecyclerView内部片段未更新加载程序内容
我有一个片段,它使用Android RecyclerView内部片段未更新加载程序内容,android,android-fragments,android-loadermanager,android-loader,android-recyclerview,Android,Android Fragments,Android Loadermanager,Android Loader,Android Recyclerview,我有一个片段,它使用RecyclerView适配器和LoaderManager来列出项目RecyclerView我使用的就是这个,我在片段中实现了LoaderManager,并将其活动的上下文提供给RecyclerView。 当我向列表中添加新项目时,它不会刷新并在列表中显示新项目。我在另一个活动中使用相同的适配器和结构,效果很好。但在这里,我在片段内部使用RecyclerView和Loader,当我添加项目时,它不会刷新列表,相反,我必须返回(完成片段)并再次输入。 我有两张像这样的桌子。首先
RecyclerView适配器
和LoaderManager
来列出项目RecyclerView
我使用的就是这个,我在片段中实现了LoaderManager
,并将其活动的上下文提供给RecyclerView
。
当我向列表中添加新项目时,它不会刷新并在列表中显示新项目。我在另一个活动中使用相同的适配器
和结构,效果很好。但在这里,我在片段内部使用RecyclerView
和Loader
,当我添加项目时,它不会刷新列表,相反,我必须返回(完成片段)并再次输入。
我有两张像这样的桌子。首先,我从student\u course
表中获取cursor
,然后从该cursor
中获取特定班级的学生ID。然后使用第一个游标
的数据,我从学生
表中获得第二个游标
,该表包含来自同一班级的学生列表。然后我将第二个光标
发送到适配器
。我对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);
String[]projection0={
DatabaseOpenHelper.COL\u学生ID,
DatabaseOpenHelper.COL\u COURSE\u ID};
String selection0=DatabaseOpenHelper.COL_COURSE_ID+“=?”;
String selectionArgs0[]={String.valueOf(courseId)};
mDataset0=getActivity().getContentResolver().query(StudentContentProvider.CONTENT\u URI2,projection0,selection0,selectionArgs0,null);
如果(mDataset0.getCount()!=0){
//批处理
List selectionList=新建ArrayList();
mDataset0.moveToFirst();
...
字符串[]项目1={
DatabaseOpenHelper.COLUMN\u ID,
DatabaseOpenHelper.COL\u学生号,
DatabaseOpenHelper.COL\u学生名称,
DatabaseOpenHelper.COL\u学生卡\u ID,
DatabaseOpenHelper.COL\u STUDENT\u COLOR};
selection1=selection1.substring(0,selection1.length()-2)+“;
mDataset1=getActivity().getContentResolver().query(StudentContentProvider.CONTENT\u URI1,projection1,selection1,selectionArgs1,null);
}否则{
mDataset1=null;
}
...
mAdapter=newstudentlistadapter(getActivity(),mDataset1,this);
mDataset1是同一班级的学生。
1) 有什么问题吗?2) 有没有办法在内部实现LoaderManager类
更新1:当我将selection1
和selectionArgs1
更改为null
时,它会在我添加项目后立即更新列表。但它显示了每个班级的所有学生,因为我没有指定选择
更新2:当我选中onLoadFinished()
时,我看到新光标在加载新内容后仍然与旧光标相同 1)我意识到添加新数据时光标不会改变,所以当我添加新数据时,我调用getLoaderManager().restartLoader(LOADER_ID,null,this)
(在我的例子中由localBrodCastManager
重新加载光标(调用onCreateLoader()
),新数据显示在列表中。(如建议的那样)。这真是个骗局。
2)我发现添加项目时,原因
光标
没有改变,因为在onCreateLoader()
上,我返回了光标
,带有特定的id
学生选择,这意味着cursor
将不会更改,直到具有特定id
的项目发生更改。因此,如果添加了新项目,则不会更改我的光标
,但如果删除或更改了其中一个项目(已列出),则光标会更改。解决方案是。显示一些代码,以便我们能够识别problem@hrskrs补充了一些澄清