我有片段,它使用RecyclerView Adapter
和LoaderManager
列出项目。 RecyclerView
我使用的是address.我在Fragment中实现的LoaderManager
,并将其活动的上下文提供给RecyclerView
。
当我将新项目添加到列表时,它不会刷新并在列表中显示新项目。我在另一个活动上使用相同的Adapter
和结构,它运作良好。但是我在Fragment中使用RecyclerView
和Loader
并且当我添加项目时它不刷新列表,而是我必须返回(完成片段)并再次输入。
我有2个表,如this。首先,我从cursor
表中获取student_course
,然后从cursor
获得特定班级的学生ID。然后使用第一个cursor
的数据,我从cursor
表中得到第二个students
,其中包含来自同一班级的学生列表。然后我将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:当我将selection1
和selectionArgs1
更改为null
时,我会在添加项目后立即更新列表。但它显示了每个班级的所有学生,因为我没有指定选择。
更新2:当我检查onLoadFinished()
时,我看到新光标在加载新内容后仍然与旧光标相同。
答案 0 :(得分:1)
1)我意识到添加新数据时光标没有变化,所以当我添加新数据时,我会调用getLoaderManager().restartLoader(LOADER_ID,null,this)
(在我的情况下为localBrodCastManager
)重新加载游标(调用onCreateLoader()
)并在列表中显示新数据。 (建议here)。这确实很棘手。
2)我发现添加项目后cursor
的原因不会发生变化,因为在onCreateLoader()
我已返回cursor
具体内容id
选择学生,这意味着cursor
不会更改,直到我已经给出具体ids
的项目发生变化。因此,如果添加了新项目,则我的cursor
不会更改,但如果删除或更改了其中一个项目(列出的项目),则会更改光标。解决方案是here。