Как я могу обновить курсор из CursorLoader?

у меня есть MainDisplayActivity, который реализует оба Activity и LoaderManager.LoaderCallbacks<Cursor>. Здесь у меня ListView, который я заполняю информацией о повестке дня, которую я получаю из своей базы данных с помощью ContentProvider. У меня также есть GridView который является календарем. Я настроил его при нажатии на ячейку, чтобы повестка дня обновлялась с щелчком дня. Моя проблема в том, что при повторном использовании загрузчика я создал в onCreate() внутри setOnItemClickListener () он не обновляет информацию с помощью нового курсора, которым я являюсь творящий. Я могу просто создать новый загрузчик с другим ID, и он работает один раз, но как только я нажимаю другой день, он перестает обновляться. Проблема заключается в курсоре. Как обновить курсор из загрузчика, чтобы не создавать новый загрузчик? Заранее спасибо!

начальный вызов для создания загрузчика в onCreate () в My MainDisplayActivity класс:

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

любой дополнительный код, Пожалуйста, сделайте не стесняйтесь спрашивать. Еще раз спасибо за любую помощь!

1 ответов


вам просто нужно немного переместить код и позвонить restartLoader. То есть,

  1. когда пользователь щелкает элемент списка, вы каким-то образом изменяете переменную частного экземпляра, которая возвращается в getChosenDate() (Я намеренно расплывчат здесь, потому что вы не указали, что именно getChosenDate() returns).

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

Дайте мне знать, если это имеет смысл. :)