【发布时间】:2012-06-20 23:57:43
【问题描述】:
所以我有我的MainDisplayActivity,它实现了Activity 和LoaderManager.LoaderCallbacks<Cursor>。这里我有一个ListView,我用我使用ContentProvider 从我的数据库中获得的议程信息来填充它。我还有一个GridView,它是一个日历。我在单击单元格时设置了它,议程会随着单击的日期更新。我的问题是,当重用我在 setOnItemClickListener() 内部的onCreate() 创建的加载程序时,它不会使用我正在创建的新光标刷新信息。我可以用另一个 ID 创建一个新的加载器,它可以工作一次,但是一旦我点击另一天,它就会停止刷新。问题出在光标上。如何从 Loader 刷新光标,这样我就不必继续创建新的 Loader?提前致谢!
在 My MainDisplayActivity 类中的 onCreate() 中创建加载器的初始调用:
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);
}
如果需要任何其他代码,请随时询问。再次感谢您的帮助!
【问题讨论】:
-
根据我的经验,当您使用
ContentResolver更新ContentProvider中的内容时,cursor会收到通知并且列表会自动更新。你也可以发布你的 onClick 代码吗? -
我知道是对的。我也假设了这一点,因为每个人都在说这有多方便。但它不这样做。问题是我也明白这怎么行不通。首次创建
Loader时,它会调用onCreateLoader()。调用getLoaderManager().initLoader()时,如果第一个arg,ID与之前实例化的Loader相同,onCreateLoader()可能不会被调用。当然,这纯粹是我的猜测,因为我仍在学习,但我认为如果是这种情况,必须有一种方法来加载新的光标。亚历克斯很乐意提供它!
标签: android debugging android-contentprovider android-loadermanager android-cursorloader