С Новым годом! Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
33 / 35 / 9
Регистрация: 03.02.2017
Сообщений: 141

Как обновить данные ViewPagera отдельного фрагмента?

21.08.2017, 23:03. Показов 2213. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть пейджер с тремя страницами. Меняется лишь содержимое третьей страницы. Имея ссылку на фрагмент можно вызывать необходимые методы по обновлению данных. Проблемы возникают при смене ориентации телефона.

Дело в том, что FragmentPagerAdapter вызывает метод для создание фрагментов public Fragment getItem(int position) лишь один раз - во время своего первого создания. При повороте экрана телефона эти фрагменты не пересоздаются с нуля - они лишь извлекаются из стека менеджером фрагментов со старыми данными переданными в агрументе. В интернетах люди подсказали, что адаптер записывает фрагменты в стек с тегом:
"android:switcher:" + containerViewId (R.id.pager) + ":" + itemPosition.
Но попытка извлечь из менеджера фрагментов желанный фрагмент с соответствующим тегом выдает null. Как получить ссылку на необходимый фрагмент? Предлагали еще шаманить с методами public Object instantiateItem(ViewGroup container, int position), public void destroyItem(ViewGroup container, int position, Object object), сохраняя фрагменты в кеш но при смене ориентации этот механизм не работает.

Можно, конечно, ухищряться и обновлять данные во фрагменте посылая ему броадкасты, но есть ли более вменяемый способ достучаться до фрагмента вьюпейджера без обновления всех данных?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2017, 23:03
Ответы с готовыми решениями:

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

Копирование отдельного фрагмента схемы
У меня есть схема с рамкой. Мне необходимо скопировать эту рамку на другой лист. Возможно ли это? Спасибо большое. (*версия 6) ...

Как прочитать многострочные данные из файла с указанного фрагмента до указанного фрагмента?
Всех с наступающим! Есть файл с содержанием: Database: vip_stroitel Table: material +-----------+-------------+ | Column ...

6
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.08.2017, 10:47
пусть фрагмент сам обращается за данными в onResume
1
33 / 35 / 9
Регистрация: 03.02.2017
Сообщений: 141
22.08.2017, 17:47  [ТС]
Цитата Сообщение от Pablito Посмотреть сообщение
пусть фрагмент сам обращается за данными в onResume
onResume сработает не всегда.
Пейджер запрашивает сразу 3 страницы (для анимации переходов между ними): текущая, +1 и -1. Если активная вторая страница то пейджер имеет одновременне все 3 горячих фрагмента и onResume не будет вызываться. Как следствие, данные не будут подтягиваться. Это сработает если активна первая страница, то есть пейджер имеет ссылки на страницу 0, 1 и при переходе на третью страницу пейджер оживит фрагмент с новыми данными.

Хорошая была идея но пока как я виже нужна ссылка на фрагмент.
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
22.08.2017, 18:05
onResume будет вызываться на том фрагменте, который на экране
на котором и нужно обновить данные

на тех, которые не видны - обновлять данные бестолку

Добавлено через 1 минуту
подозреваю, что эта тема похожа на Обновление данных в ViewPager при перелистывании вкладок
0
33 / 35 / 9
Регистрация: 03.02.2017
Сообщений: 141
22.08.2017, 19:04  [ТС]
Цитата Сообщение от Pablito Посмотреть сообщение
onResume будет вызываться на том фрагменте, который на экране
на котором и нужно обновить данные
Логи показывают, что onResume вызывается сразу 2-х фрагментов: который на экране, и соседнего +1. По логике onResume должен вызываться когда фрагмент становится видимым на экране. В этом вся фишка: в случае вьюпейджера соседние экраны как-бы не видны но на самом деле видны - чтобы обеспечить анимацию свайпа. Я же не с потолка написал прежний комментарий.
0
14 / 13 / 4
Регистрация: 11.08.2016
Сообщений: 87
22.08.2017, 22:18
Не уверен что до конца понял проблемму из-за плохого знания матчасти, но попробуйте такую реализацию.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class TabAdapter extends FragmentPagerAdapter {
 
    String frag1Tag = "";
    String frag2Tag = "";
    String frag3Tag = "";
 
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
 
        switch (position) {
            case 0:
                frag1Tag = fragment.getTag();
                break;
            case 1:
                frag2Tag = fragment.getTag();
                break;
            case 2:
                frag2Tag = fragment.getTag();
                break;
        }
 
        return fragment;
    }
 
     // Другие методы которые нужно переопределить
    
 
 
 
 
}
Из TabAdapter получаете теги фрагментов, а после делайте с этими фрагинтами что хотите.
По сути это получение того же "android:switcher:" + containerViewId (R.id.pager) + ":" + itemPosition. Но только если если разработчики захотят что-то изменить в виде записи то ваше приложение от этого не должно пострадать
0
33 / 35 / 9
Регистрация: 03.02.2017
Сообщений: 141
22.08.2017, 23:08  [ТС]
Цитата Сообщение от Gukamanav Посмотреть сообщение
Из TabAdapter получаете теги фрагментов, а после делайте с этими фрагинтами что хотите.
По сути это получение того же "android:switcher:" + containerViewId (R.id.pager) + ":" + itemPosition. Но только если если разработчики захотят что-то изменить в виде записи то ваше приложение от этого не должно пострадать
Я использую в качестве адаптера FragmentStatePagerAdapter, а он, оказывается, в отличие от FragmentPagerAdapter, реализовал по другому метод instantiateItem. Он просто добавляет в стек фрагмент менеджера 3 фрагмента без тегов:
FragmentStatePagerAdapter
Java
1
mCurTransaction.add(container.getId(), fragment);
FragmentPagerAdapter
Java
1
mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId));


Я, впринципе, немножко разкурил его и решил задачу но я хочу найти более элегантное решение. Время терпит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.08.2017, 23:08
Помогаю со студенческими работами здесь

Казус с выгрузкой отдельного фрагмента информации из XML файла
Есть БД в виде XML файла для теста на C#. Как выгружать именно какой-то отдельный вопрос и список ответов сразу на этот вопрос, а не всё...

Как обновить данные на форме у клиентов, сразу же когда обновились данные в базе
Нужно реализовать мини-чат. Клиент пишет текст в таблицу, и как только текст добавился в таблицу необходимо как-то обновить данные у...

Как обновить данные отчета?
Здравствуйте! У меня такая ситуация имеется отчет, сформированный по таблице. Предполагается что в таблицу будут добавляться данные, уже...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru