Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 加载程序未获取更新ListFragment的回调_Android_Android Listfragment_Android Loadermanager - Fatal编程技术网

Android 加载程序未获取更新ListFragment的回调

Android 加载程序未获取更新ListFragment的回调,android,android-listfragment,android-loadermanager,Android,Android Listfragment,Android Loadermanager,我有一个活动,它可以从google日历中提取所有用户日历事件,可以很好地插入到数据库中,但是活动的ListFragment`的加载程序永远不会在发生更改时获取用于刷新列表的回调。我必须退出活动,然后回来让加载程序正确加载所有内容 我以前做过加载程序,从来没有遇到过这个问题,我基本上是从我的另一个项目中复制了加载程序,它可以正常工作,所以我不明白为什么当内容发生变化时它不能得到回调 这是我在数据库中插入的方法 @Override public Uri insert(Uri uri, Content

我有一个活动,它可以从google日历中提取所有用户日历事件,可以很好地插入到数据库中,但是活动的ListFragment`的加载程序永远不会在发生更改时获取用于刷新列表的回调。我必须退出活动,然后回来让加载程序正确加载所有内容

我以前做过加载程序,从来没有遇到过这个问题,我基本上是从我的另一个项目中复制了加载程序,它可以正常工作,所以我不明白为什么当内容发生变化时它不能得到回调

这是我在数据库中插入的方法

@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,因此适配器会更新,但它不会

这是我的列表片段


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

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

在我的上一个项目中,我也被同样的事情烧坏了。奇怪的是,我用Loader查看了我的其他项目,我也有这样的方式,但它是有效的…@superfell,非常感谢。我不知道notifyChange和setNotificationUri的用途。我的代码还没有经过适当的测试,但我认为如果我使用content://com.my_provider/my_table 当我插入一个项目并使用URI作为setNotificationUri的第二个参数时,我应该在删除要通知的项目时使用相同的URI。在我的上一个项目中,我被相同的事情烧坏了。奇怪的是,我用加载程序查看我的其他项目,我也有这种方法,但它是有效的…@superfell,非常感谢。我不知道notifyChange和setNotificationUri的用途。我的代码还没有经过适当的测试,但我认为如果我使用content://com.my_provider/my_table 当我插入一个项目并使用URI作为setNotificationUri的第二个参数时,我应该在删除要通知的项目时使用相同的URI
@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);

} 
@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;
}