我怎样才能刷新从CursorLoader光标?(How can I refresh the curs

2019-06-25 14:23发布

所以,我有我的MainDisplayActivity它实现了两个Activity ,并LoaderManager.LoaderCallbacks<Cursor> 。 在这里,我有一个ListView ,我充满了我使用ContentProvider的从我的数据库获取日程信息。 我也有一个GridView是一个日历。 我把它单击单元格时,该议程与点击每天更新设置。 我的问题是重用我创建的装载机时onCreate()的setOnItemClickListener()内,它并没有刷新新的光标,我创建的信息。 我可以创建另一个ID一个新的Loader,和它的作品一次,但一旦我点击的一天,它停止耳目一新。 这个问题,在于光标。 我怎样才能刷新从装载机光标所以我没有继续创造一个新的Loader? 提前致谢!

初始调用在我创建的onCreate()的装载机MainDisplayActivity类:

makeProviderBundle(new String[] {"_id, event_name, start_date, start_time, end_date, end_time, location"},
            "date(?) >= start_date and date(?) <= end_date", new String[]{getChosenDate(), getChosenDate()}, null);
    getLoaderManager().initLoader(0, myBundle, MainDisplayActivity.this);

    list.setAdapter(agendaAdapter);

这些是从覆盖的方法LoaderCallbacks<Cursor>

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    Uri baseUri = SmartCalProvider.CONTENT_URI;
    return new CursorLoader(this, baseUri, args.getStringArray("projection"), 
            args.getString("selection"), args.getStringArray("selectionArgs"), args.getBoolean("sortOrder") ? args.getString("sortOrder") : null );
}



@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
    agendaAdapter.swapCursor(arg1);
}



@Override
public void onLoaderReset(Loader<Cursor> arg0) {
    //Not really sure how this works. Maybe I need to fix this here?
    agendaAdapter.swapCursor(null);

}

public void makeProviderBundle(String[] projection, String selection, String[] selectionArgs, String sortOrder){
    /*this is a convenience method to pass it arguments 
     * to pass into myBundle which in turn is passed 
     * into the Cursor loader to query the smartcal.db*/
    myBundle = new Bundle();
    myBundle.putStringArray("projection", projection);
    myBundle.putString("selection", selection);
    myBundle.putStringArray("selectionArgs", selectionArgs);
    if(sortOrder != null) myBundle.putString("sortOrder", sortOrder);
}

任何额外的代码需要,请不要犹豫,问。 再次感谢任何帮助!

Answer 1:

你只需要移动你的代码周围一点点,并呼吁restartLoader 。 那是,

  1. 当用户点击列表项,你莫名其妙地更改在返回的私有实例变量getChosenDate()我是故意含糊这里,因为你没有指定究竟getChosenDate()返回)。

  2. 一旦做出更改,请致电getLoaderManager().restartLoader()在你的Loader 。 你的旧数据将被丢弃, restartLoader将触发onCreateLoader再次调用。 这一次, getChosenDate()将返回不同的值(取决于所单击列表项),而且应该这样做。 你onCreateLoader实现应该是这个样子:

     @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { Uri baseUri = SmartCalProvider.CONTENT_URI; makeProviderBundle( new String[] { "_id, event_name, start_date, start_time, end_date, end_time, location" }, "date(?) >= start_date and date(?) <= end_date", new String[]{ getChosenDate(), getChosenDate() }, null); return new CursorLoader( this, baseUri, args.getStringArray("projection"), args.getString("selection"), args.getStringArray("selectionArgs"), args.getBoolean("sortOrder") ? args.getString("sortOrder") : null); } 

让我知道,如果是有道理的。 :)



文章来源: How can I refresh the cursor from a CursorLoader?