Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.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 如何从游标加载程序刷新游标?_Android_Debugging_Android Contentprovider_Android Loadermanager_Android Cursorloader - Fatal编程技术网

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创建一个新的加载器,它只工作一次,但一旦我点击另一天,它就会停止刷新。问题在于光标。如何从加载程序中刷新光标,以便不必继续创建新的加载程序?提前谢谢

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