Хранение ListFragments в FragmentPager в синхронизации - PullRequest
0 голосов
/ 27 февраля 2012

Допустим, у меня есть список однородных элементов, которые, вероятно, будут изменены в течение срока моей активности в результате взаимодействия с пользователем или событий ОС. Activity содержит FragmentPager, который показывает число ListFragment с.

Эти фрагменты разделяют ранее упомянутые данные, но отображают их по-разному. Например. они различаются по порядку сортировки или отображают только подмножество данных. В настоящее время каждый фрагмент хранит отдельный список, содержащий соответствующую часть данных в соответствующем порядке.

Когда данные изменяются, в основном каждый фрагмент должен быть обновлен. Это означает использование или добавление / удаление элементов из некоторых фрагментов. Каков наилучший способ сохранения согласованности данных в разных фрагментах?

В настоящее время у меня есть какой-то объект-наблюдатель, который уведомляется, когда что-то изменяется, и впоследствии уведомляет связанные фрагменты. Но есть пара проблем:

  • Когда приложение только начиналось, некоторые фрагменты не были созданы FragmentPager, поэтому уведомить их невозможно.
  • При просмотре фрагментов некоторые из них останавливаются. В этом состоянии они не могут обновить свой список. Должны ли они отключиться от наблюдателя в этом случае? Это приводит к:
  • Когда происходит изменение, когда фрагмент отключен, он по существу пропускает его.
  • И так далее ...

Ответы [ 3 ]

0 голосов
/ 07 октября 2012

Вы можете хранить свои данные в классе Application, обновлять только видимые фрагменты, когда данные изменились, и всегда запрашивать новые данные в onResume () Fragment, что сделает это

0 голосов
/ 08 октября 2012

Что бы я сделал, чтобы каждый ListFragment использовал Loader для загрузки своих данных.Затем вместо того, чтобы наблюдатель уведомил Fragment (который мог быть убит), чтобы обновить свои данные, зарегистрируйте наблюдателя для каждого Loader, чтобы он знал, когда источник данных изменился, и будет повторно запрашивать, когдаодин был обнаружен.(Если ваш источник данных - база данных SQLite, и вы используете ContentProvider, CursorLoader сделает все это за вас).

Это реализация, которую я рекомендовал бы, потому что

  1. Каждое поведение Fragment остается автономным (т. Е. Каждый является повторно используемым компонентом, который не привязан к какому-либо конкретному ViewPager или Activity).

  2. Это позволяет избежать сложностей, связанных с необходимостью иметь дело с потенциально уничтоженными Fragment s в пределах ваших ViewPager.

Если вам нужно быстрое решение, вы, вероятно, можете сойти с рук.заставляя Fragment s оставаться в памяти, используя ViewPager#setOffScreenPageLimit(int limit), как предлагает Иван ... однако, на мой взгляд, это не так уж чисто от решения.

0 голосов
/ 27 февраля 2012

Если я понял, ваш ViewPager показывает те же данные (или их часть), но в разных представлениях. Поэтому я верю, что ViewPager не должен действовать каким-либо образом при изменении данных, это ответственность Адаптера.

О пунктах ниже вы сказали: а) создание фрагментов внутри ViewPager может осуществляться вами. Просто посмотрите на javadoc метода ViewPager::setOffscreenPageLimit(int limit) б) Я думаю, что вы ничего не должны делать с пользовательским интерфейсом, когда данные изменены, но фрагмент находится в состоянии паузы. Если вы хотите обновить, сделайте это в onResume (). Или лучше установить какое-либо поле в БД (если оно есть) в состояние «обновления присутствуют» и проверить его при появлении Activity (Fragment). в) Как и в предыдущем варианте - если фрагмент отключен, просто игнорируйте обновления. Или, если вы действительно заинтересованы в этом обновлении, используйте липкую BroadcastReciver (будьте осторожны, липкая БР - дорогая вещь)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...