27

所以我有我的MainDisplayActivitywhich 实现了ActivityLoaderManager.LoaderCallbacks<Cursor>。这里我有 A ListView,我使用 ContentProvider 从我的数据库中获取的议程信息填充它。我也有GridView一个日历。我在单击单元格时设置了它,议程会随着单击的日期更新。我的问题是,当重用我在onCreate()setOnItemClickListener() 内部创建的加载器时,它不会用我正在创建的新光标刷新信息。我可以用另一个 ID 创建一个新的加载器,它可以工作一次,但是一旦我点击另一天,它就会停止刷新。问题出在光标上。如何从 Loader 刷新光标,这样我就不必继续创建新的 Loader?提前致谢!

MainDisplayActivity在 My类的 onCreate() 中创建 Loader 的初始调用:

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

需要任何其他代码,请随时询问。再次感谢任何帮助!

4

1 回答 1

43

您只需稍微移动代码并调用restartLoader. 那是,

  1. 当用户单击列表项时,您会以某种方式更改返回的私有实例变量getChosenDate()(我在这里故意含糊其辞,因为您没有指定确切getChosenDate()返回的内容)。

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

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

于 2012-06-19T00:23:48.040 回答