【问题标题】:How can I refresh the cursor from a CursorLoader?如何从 CursorLoader 刷新光标?
【发布时间】:2012-06-20 23:57:43
【问题描述】:

所以我有我的MainDisplayActivity,它实现了ActivityLoaderManager.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&lt;Cursor&gt; 的重写方法

@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


【解决方案1】:

您只需稍微移动代码并调用restartLoader。也就是说,

    1234563 /p>
  1. 更改完成后,请在您的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);
    }
    

让我知道这是否有意义。 :)

【讨论】:

  • 天哪,哈哈。真是天才哈哈。我明白你在说什么。所以我可以调用的方法是restartLoader()。为什么我在 CursorLoader 中没有看到该方法?!哦,对不起,getChosenDate() 以数据库使用的格式返回一个字符串日期,所以我可以使用 SQLite 而不是 java 代码进行所有过滤。
  • 老兄!!!我爱你!它工作得很好。看看我在myBundle.putString("date", getChosenDate()); 中意识到的代码,这是不必要的。所以我把它取下来了。我只是在调用makeProviderBundle() 时使用它。非常感谢...再次!
  • 哈哈...你很容易兴奋,不是吗。很高兴我能帮忙:)。
  • 是的,我是。就在我最近几天将我的代码从不推荐使用的代码转移到不推荐使用的代码的同时学习Android的新功能时,感觉很好理解它。我的第一个应用程序,所以我很炒作。干杯我的朋友。
  • 这也是我的感觉。很高兴它对你有用!
猜你喜欢
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多