Intereting Posts
Может ли Android WebView автоматически изменять размеры огромных изображений? Моя строка состояния в android 4.2.2 эмулятора сломана Окно «Оверлей системы» вызывает проблемы с нажатием кнопки «клавиатура» и «Назад» «Проекты библиотеки Android не могут быть запущены»? Почему моя производительность увеличивается при касании экрана? Как изменить видимость компоновки программно Android Layout: горизонтальный Recyclerview внутри вертикального Recyclerview внутри Viewpager с поведением прокрутки Создать кнопку с закругленными углами в android Переполнение ReferenceTable (max = 512) JNI Android. Как взять EditText (числа), затем преобразовать его в целое число, чтобы использовать его для математики? Включить клавиатуру электронной почты в android для ввода типа электронной почты Кросс-компиляция GCC с помощью newlib для ARM: как указать параметры GCC, такие как -march? Android – Ускорение вниз (разбить) Пользовательский адаптер для gridview в android Android Location Providers – GPS или сетевой провайдер?

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

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

Первоначальный вызов для создания загрузчика в 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); } 

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

Solutions Collecting From Web of "Как я могу обновить курсор из CursorLoader?"

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

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

  2. После getLoaderManager().restartLoader() изменений вызовите getLoaderManager().restartLoader() на вашем Loader . Ваши старые данные будут отброшены, и restartLoader вызовет onCreateLoader для повторного 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); } 

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