Перезагрузить или уведомить данные фрагмента в ViewPager

У меня есть [main]Fragment с двумя ViewPagers в нем. Каждый ViewPager содержит несколько Fragments. Fragments ViewPager получают данные в свои ListViews от [main]Fragment. Мне нужно обновить данные во всех ListViews, которые приходят из [main]Fragment.


Я пытался удалить текущий [main]Fragment и добавить новый (перезагрузить его), но когда я вызываю методы .remove([main]Fragment) или .detach([main]Fragment) в .supportFragmentManager(), [main]Fragment не уничтожает и не отсоединяет, он просто скрывается, и я не могу добавить новый, просто сделайте .atach([main]Fragment) для текущего ... Перезагрузка - плохая идея. Помогите мне, пожалуйста.


person AskQuestion    schedule 11.09.2014    source источник
comment
вы использовали childFragmentManager ?   -  person Akhil    schedule 11.09.2014
comment
Это сложный вопрос, потому что он принимает очень много форм и может быть решен многими способами. Я включил решение для наблюдения за контентом ниже, потому что у вас есть идентификатор пользователя Neato.   -  person danny117    schedule 11.09.2014
comment
Ахил, да. Для всех дочерних фрагментов.   -  person AskQuestion    schedule 11.09.2014


Ответы (1)


Обозреватели контента

Вот простой URI, который ссылка не показывает, как это сделать. Поместите это в класс, который изменяет данные, чтобы любой фрагмент мог получить к нему статический доступ через ClassName.CONTENT_URI.

private static final String BASE_PATH = "Imustdorefresh";//see content providers
private static final String AUTHORITY = "somethinguniquehereprobablyappcomname";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
            + "/" + BASE_PATH);

Этот код идет фрагментами при возобновлении, смотрите ссылку, не забудьте отменить регистрацию в onpause.

getContentResolver().
      registerContentObserver(
            CONTENT_URI,
            true,
            yourObserver);

//yourObserver — это код для обновления фрагмента {делаем здесь код}

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

getContext().getContentResolver().notifyChange(CONTENT_URI,null);

Дополнительные сведения см. в разделе поставщик контента и наблюдатель контента. Дополнительные сведения о поставщике контента

person danny117    schedule 11.09.2014
comment
Это неправильное решение для меня. Я должен взять ArrayList и обновить его в основном фрагменте, затем дочерние фрагменты берут части этого ArrayList и отображают их в своих списках, которые мне нужно обновить. Если вы знаете, как сделать что-то подобное, пожалуйста, помогите мне. - person AskQuestion; 11.09.2014
comment
Может быть, обновить массив основных фрагментов и уведомить об этом адаптер пейджера? Но когда я это сделал, дочерние фрагменты ничего не делают... Может быть, я сделал что-то не так. - person AskQuestion; 11.09.2014
comment
Это решение работает между разными приложениями, поэтому оно легко работает с любым уровнем вложенных дочерних фрагментов. Суть в том, что распознаватель содержимого обрабатывает обмен сообщениями между провайдером и наблюдателем. - person danny117; 11.09.2014
comment
В зависимости от новых данных ViewPager может создавать больше или меньше фрагментов. Может быть есть способ перезагрузить viewpager, pageradapter или main фрагмент, т.к. не думаю, что ваш метод это сделает( - person AskQuestion; 12.09.2014
comment
@AskQuestion Вы сказали, что мне нужно обновить список, для чего предназначен этот пример кода. Теперь вы хотите обновить viewpager. Вам придется показать нам какой-то реальный код, и, надеюсь, я соответствующим образом обновлю свой ответ, иначе вмешается новый пользователь. - person danny117; 12.09.2014