Android 如何从游标加载程序刷新游标?
因此,我有了我的Android 如何从游标加载程序刷新游标?,android,debugging,android-contentprovider,android-loadermanager,android-cursorloader,Android,Debugging,Android Contentprovider,Android Loadermanager,Android Cursorloader,因此,我有了我的main显示活动,它实现了Activity和LoaderManager.LoaderCallbacks。这里我有一个列表视图,我用从数据库中使用ContentProvider获取的议程信息填充它。我还有一个GridView日历。我在点击一个单元格时已经设置好了,日程会随着点击的日期而更新。我的问题是,在setOnItemClickListener()内部重用我在onCreate()中创建的加载程序时,它不会使用我正在创建的新光标刷新信息。我可以用另一个ID创建一个新的加载器,它只
main显示活动
,它实现了Activity
和LoaderManager.LoaderCallbacks
。这里我有一个列表视图
,我用从数据库中使用ContentProvider获取的议程信息填充它。我还有一个GridView
日历。我在点击一个单元格时已经设置好了,日程会随着点击的日期而更新。我的问题是,在setOnItemClickListener()内部重用我在onCreate()
中创建的加载程序时,它不会使用我正在创建的新光标刷新信息。我可以用另一个ID创建一个新的加载器,它只工作一次,但一旦我点击另一天,它就会停止刷新。问题在于光标。如何从加载程序中刷新光标,以便不必继续创建新的加载程序?提前谢谢
在MyMainDisplayActivity
类的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);
makeProviderBundle(新字符串[]{“\u id、事件名称、开始日期、开始时间、结束日期、结束时间、位置”,
“date(?)>=start\u date和date(?)您只需稍微移动代码,然后调用restartLoader
当用户单击列表项时,您会以某种方式更改在getChosenDate()
中返回的私有实例变量(我在这里故意含糊其辞,因为您没有指定getChosenDate()
返回的确切内容)
更改完成后,在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);
}
@覆盖
公共加载器onCreateLoader(int-id,Bundle-args){
Uri baseUri=SmartCalProvider.CONTENT\u Uri;
makeProviderBundle(
新字符串[]{“\u id、事件名称、开始日期、开始时间、结束日期、结束时间、位置”,
“日期(?)>=开始日期和日期(?)根据我的经验,当您使用ContentResolver
更新ContentProvider
中的内容时,光标会得到通知,列表会自动更新。您也可以发布onClick代码吗?我知道。我也这么认为,因为大家都说这很方便。但我ts没有这样做。问题是我也明白这是怎么回事。当加载程序第一次创建时,它调用onCreateLoader()
。当调用getLoaderManager().initLoader()
时,如果第一个参数是加载程序,则ID与之前实例化的onCreateLoader()相同
可能不会被调用。当然这只是我的猜测,因为我还在学习,但我认为如果是这样的话,必须有一个方法来加载新光标。Alex很好地提供了它!天哪,shiznit lol。这是天才哈哈。我明白你的意思。所以我可以调用的方法是restartLoader()
。为什么我在CursorLoader中看不到这个方法?!哦,对不起,getChosenDate()
以数据库使用的格式返回一个字符串日期,这样我就可以用SQLite而不是java代码进行所有筛选了。伙计!!!我爱你!它工作得很好。看看我在myBundle.putString(“日期”)中实现的代码,getChosenDate());
,这是不必要的。所以我把它取了下来。我只是想在调用makeProviderBundle()
时使用它。再次非常感谢!哈哈…你很容易激动,不是吗。很高兴我能帮上忙:).是的,是的。就在这几天,我在学习Android新功能的同时,将我的代码从不推荐的代码移到了不推荐的代码时,理解它感觉很好。我的第一个应用程序,所以我非常激动。为我的朋友干杯。这也是我的感受。很高兴它为你成功了!
@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);
}