Fragment里面的Android RecyclerView没有更新Loader内容

时间:2015-03-20 14:23:25

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

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

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

我有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:当我将selection1selectionArgs1更改为null时,我会在添加项目后立即更新列表。但它显示了每个班级的所有学生,因为我没有指定选择。

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

1 个答案:

答案 0 :(得分:1)

1)我意识到添加新数据时光标没有变化,所以当我添加新数据时,我会调用getLoaderManager().restartLoader(LOADER_ID,null,this)(在我的情况下为localBrodCastManager)重新加载游标(调用onCreateLoader())并在列表中显示新数据。 (建议here)。这确实很棘手。

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