Я нашел один, по крайней мере, обходной путь. Буду признателен, если кто-нибудь знает лучшее решение.
Чтобы использовать Loader, вы должны переопределить 3 метода:
- onCreateLoader (int id, Bundle arg1)
- onLoadFinished (загрузчик загрузчика, курсор курсора) и
- onLoaderReset (загрузчик arg0)
Итак, скажем, у нас есть один телевизор TextView, который должен обновляться через ContentProvider.
in onCreateLoader () :
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {
String select = "where _id="+id; //id is definied earlier in this program
loader = new CursorLoader(getActivity(),
MaterialContentProvider.READ_SINGLE_MATSTAMM_URI, null, select, null, null);
}
return loader;
}
MaterialContentProvider.READ_SINGLE_MATSTAMM_URI - это мой URI, который показывает ContentProvider, какую таблицу БД использовать и как. В этом случае я получу единственный результат.
Это мы получим асинхронно через onLoadFinished () и вот мой обходной путь:
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
final TextView tv = (TextView) View.findViewById(R.id.mytextview);
tv.setText(cursor.getString(cursor.getColumnIndex("myColumn")));
}
С этого момента ваш текстовый телевизор будет обновляться каждый раз, когда содержимое меняется в таблице, на которую нацелен URI в onCreateLoader (). «Хитрость» заключается в том, чтобы не отдавать курсор, как вы это обычно делаете (с чем-то вроде «adapter.swap (cursor)»), потому что нет ничего с адаптером. Чтобы получить общую сумму столбца, вы должны получить все строки этого специального столбца с помощью курсора (что означает, что у вас другой URI).