我怎样才能从CursorLoader刷新游标?

所以我有我的MainDisplayActivity实现了ActivityLoaderManager.LoaderCallbacks<Cursor> 。 在这里,我有一个ListView ,填充了我使用ContentProvider从数据库中获得的日程信息。 我也有一个GridView ,它是一个日历。 点击一个单元格时,我已经设置好了,点击的日子就会更新日程表。 我的问题是,当重新使用setOnItemClickListener()中的onCreate()创build的Loader时,它不刷新我正在创build的新游标的信息。 我可以用另外一个ID创build一个新的Loader,它可以工作一次,但是一旦我点击另外一天,就会停止刷新。 问题在于游标。 我怎样才能从一个Loader刷新光标,所以我不需要继续创build一个新的Loader? 提前致谢!

初始调用在MainDisplayActivity类中的onCreate()中创buildLoader:

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

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

Solutions Collecting From Web of "我怎样才能从CursorLoader刷新游标?"

你只需要稍微移动你的代码并调用restartLoader 。 那是,

  1. 当用户点击一个列表项时,以某种方式改变了在getChosenDate()返回的私有实例variables(我在这里是有意含糊的,因为你没有指定getChosenDate()返回的内容)。

  2. 一旦完成更改,请在Loader上调用getLoaderManager().restartLoader() 。 您的旧数据将被丢弃,并且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); } 

让我知道,如果这是有道理的。 🙂