android - 加载器没有获得更新 ListFragment 的回调

标签 android android-listfragment android-loadermanager

我有一个 Activity ,可以从 Google 日历中提取所有用户日历事件,可以很好地插入到数据库中,但是该 Activity 的 ListFragment` 的 Loader 永远不会收到回调当有变化时刷新列表。我必须退出 Activity ,然后返回,以便加载程序正确加载所有内容。

我以前做过加载器,从来没有遇到过这个问题,我基本上是从另一个工作正常的项目复制了加载器,所以我不明白为什么它在内容更改时没有得到回调?

这是我插入数据库的方法

@Override
public Uri insert(Uri uri, ContentValues values) {
    long rowID = db.insert(EVENTS_TABLE,null, values);
    Uri _uri = null;
    if(rowID > 0){
        _uri = ContentUris.withAppendedId(CONTENT_ID_URI_BASE,rowID);
        getContext().getContentResolver().notifyChange(_uri,null);

    }else{
        throw new SQLException("Failed to insert row into " + uri);
    }
    return _uri;
}

如您所见,我正在调用 notifyChange,因此适配器会更新,但它不会更新。

这是我的ListFragment

@Override
public void onActivityCreated(Bundle state){
    super.onActivityCreated(state);

    lv = getListView();
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    View v = getView();
    v.setClickable(true);
    setEmptyText("No Events");
    populate();
}

public void populate(){
    mAdapter = new CalendarRowAdapter(getActivity(), R.layout.calendar_view, null,
            new String[] {CalendarProvider.EVENT,CalendarProvider.LOCATION,CalendarProvider.DESCRIPTION,CalendarProvider.START},
            new int[] {R.id.calendarEntryText,R.id.locationEntryText,R.id.descEntryText,R.id.dateEntryText},0);

    setListAdapter(mAdapter);

    getLoaderManager().initLoader(0,null,this);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    return new CursorLoader(getActivity(),
            CalendarProvider.CONTENT_URI,new String[] {CalendarProvider.ID,CalendarProvider.EVENT,
        CalendarProvider.LOCATION,CalendarProvider.DESCRIPTION,CalendarProvider.START}
    ,null,null,CalendarProvider.START + " COLLATE LOCALIZED ASC");
}

@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
    mAdapter.swapCursor(arg1);
    if(isResumed()){
        setListShown(true);
    }else{
        setListShownNoAnimation(true);
    }
}

@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    mAdapter.swapCursor(null);

} 

就像我说的,一切都正确地进入数据库,只是加载器没有获得刷新列表的回调。

日历事件从AsyncTask放入数据库,但我认为这不是问题

logcat 也没有显示任何错误

编辑

我的查询方法

@Override
public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder) {
    SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
    sqlBuilder.setTables(EVENTS_TABLE);

    if(uriMatcher.match(uri) == 1){
        sqlBuilder.setProjectionMap(mMap);
    }else if(uriMatcher.match(uri) == 2){
        sqlBuilder.setProjectionMap(mMap);
        sqlBuilder.appendWhere(ID + "=?");
        selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,new String[] {uri.getLastPathSegment()});
    }
    if(sortOrder == null || sortOrder == "")
        sortOrder = START + " COLLATE LOCALIZED ASC";
    Cursor c = sqlBuilder.query(db, projection, selection, selectionArgs,null,null, sortOrder);
    c.setNotificationUri(getContext().getContentResolver(), uri);
    return c;
}

最佳答案

在插入方法中,您可以使用插入的特定行的 URI 调用 notifyChange,但在查询端,该 URI 是代表整个数据集的不同 URI。 /foo/bar/1 上的 notifyChange 不会通知监听 /foo/bar 的监听器。因此,在 insert() 方法中,您需要使用数据集的 URI(而不是特定行)调用 notifyChange

关于android - 加载器没有获得更新 ListFragment 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14362076/

相关文章:

java - 无法在 android 的 SimpleArcLoader 中设置自定义颜色

android - Owl Carousel 在移动 ios/android 上快速滚动时启用拖动

使用 fragment 的 Android 功能区菜单

android - 带有扩展 SimpleCursorAdapter 的 nullPointerException

android - 错误 : java. lang.NullPointerException 在 android.support.v4.content.Loader

android - 将 ListFragment 与带有 Holder 模式的 SimpleCursorAdapter 结合使用

android - 标题项的 iOS 设备右浮动问题

android - Firebase Analytics 不在仪表板中显示任何数据

android - 为什么我的 ListView 项目被选中,但点击后没有突出显示?

android - 在后台堆栈中添加同一 fragment 的多个实例,先前添加的实例的数据仍然存在