Пользовательский загрузчик SQLite - слушайте обновления из другого фрагмента/действия

В моем приложении у меня есть БД SQLIte. У меня есть ListView, для которого требуются данные из БД, поэтому я решил попробовать Loaders.

У меня есть 2 фрагмента:

Фрагмент A - имеет ListView с адаптером, который получает данные из БД с помощью пользовательского загрузчика.

Фрагмент B - это фрагмент "редактировать элемент", в котором элементы редактируются, а затем обновляются в БД.

Поскольку фрагмент B не может (и, насколько я понимаю, не должен) получить доступ к загрузчику во фрагменте A, редактирование элементов во фрагменте B не обновляет фрагмент A.

Как мне решить эту проблему? Можно ли это вообще решить с помощью загрузчиков?


person dors    schedule 13.06.2014    source источник
comment
все, что вам нужно, это хорошо написанный пользовательский ContentProvider, см. учебник по Блокноту   -  person pskink    schedule 13.06.2014
comment
Вы имеете в виду использование ContentObserver? Я думал о реализации ContentObserver, но это слишком много для того, что мне нужно.   -  person dors    schedule 13.06.2014
comment
нет, ContentProvider, узнайте, как использовать ContentResolver для регистрации Uri и уведомления об изменениях, обратитесь к поставщику Блокнота.   -  person pskink    schedule 13.06.2014


Ответы (1)


Если оба фрагмента находятся в одном и том же Activity, они могут получить доступ к одному и тому же loader. Я думаю, ваша проблема в том, что вы инициализируете загрузчик внутри фрагмента следующим образом:

getLoaderManager().initLoader(...);

Когда вы должны делать это вместо этого:

getActivity().getLoaderManager().initLoader(...);

Используйте эту же строку кода во втором фрагменте, чтобы получить доступ к тому же загрузчику и показать данные для редактирования. После того, как вы отредактировали его и обновили базу данных, вам нужно вызвать forceLoad() (поскольку вы не реализуете наблюдателя в своем пользовательском загрузчике), чтобы загрузить новые данные в загрузчик:

getActivity().getLoaderManager().getLoader(loaderId).forceLoad();

Когда вы вернетесь к первому фрагменту, будет создана иерархия представлений и вызван initLoader() (обычно реализуется в onCreateView() или onActivityCreated()), который напрямую вызовет onLoadFinished(), поскольку загрузчик уже существует и уже обновлен вторым фрагментом.

person ILovemyPoncho    schedule 14.06.2014
comment
Кажется, это работает хорошо (получение загрузчика из действия). Кажется, мне не нужен жесткий ForceLoad - person dors; 14.06.2014