Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Kemaweyan
2 / 2 / 1
Регистрация: 16.12.2014
Сообщений: 5
1

ViewPager.setCurrentItem() внутри LoaderCallbacks.onLoadFinished()

22.01.2015, 22:59. Просмотров 672. Ответов 1
Метки нет (Все метки)

Столкнулся с проблемой. В приложении главная активность - список ListView, при выборе элемента списка открывается новая активность с ViewPager, где должен отображаться выбраный элемент списка («подробная информация») с возможностью пролистывания. Данные берутся из БД через LoaderManager. Проблема состояит в том, что в этом случае отваливается панель действий фрагмента, которая появляется только после пролистывания.

Приведу пример. Есть список из, допустим, 10 элементов. Если нажать на элемент №5, то откроется вторая активность с этим самым 5 элементом, но панели дейсвий не будет видно. Если пролистнуть на №4 или №6 - панель появляется. Если потом вернуться на №5 - панель есть. onCreateOptionsMenu фрагмента во всех случаях вызывается.

Проблема эта проявляется только в том случае, если используется LoaderManager, а точнее если переключение на выбраный элемент ViewPager.setCurrentItem() вызывать внутри LoaderCallbacks.onLoadFinished(). Если этот вызов убрать, то при выборе любого элемента списка будет открываться первый (первая страница ViewPager) и с панелью действий всё будет нормально. Аналогично нет проблем, если отказаться от LoaderManager и весь код выполнять в onCreate активности (загрузка курсора, создание адаптера, переключение на выбраную страницу). Но это же не совсем корректно - грузить данные из БД в главном потоке.

В документации к LoaderCallbacks про onLoadFinished() вычитал вот что:

Note that normally an application is not allowed to commit fragment transactions while in this call, since it can happen after an activity's state is saved.
Т.е. получается, что вызов ViewPager.setCurrentItem() в данном месте не совсем правильный? Это могло бы объяснить странный баг с панелью, но как тогда иначе переключить страницу?

Добавлено через 4 часа 6 минут
Проблему, похоже, решил. Помогло это руководство. Конкретно нужно было, видимо, вынести ViewPager.setAdapter() из onLoadFinished() в onCreate(). Для этого пришлось переписать класс адапртера, чтоб можно было присваивать курсору null, а потом менять курсор при необходимости. Теперь панель не пропадает.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2015, 22:59
Ответы с готовыми решениями:

Подвисает ViewPager с фрагментами внутри
Собственно вот в чём соль. Есть ViewPager с фрагментами внутри, в каждом...

ViewPager внутри ListView, Как вставить?
Здравствуйте. Есть задача, внутри ListView сделать айтемы, которые содержат...

Как отобразить ViewPager внутри другой активити
Подскажите пожалуйста. Изучил данный урок. И хочу сделать такую прокрутку...

Повторное создание фрагмента внутри фрагмента ViewPager
Доброго времени суток! Использую внутри фрагмента элемент ViewPager, который...

Не запускается метод onLoadFinished
Есть класс 1: import android.app.Activity; import...

1
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,732
23.01.2015, 10:01 2
Kemaweyan, за ссылку спасибо. Поизучаю на досуге, как они делают андроидные программы.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2015, 10:01

ViewPager
Здравствуйте! В приложении использовал пример с Хабра...

ViewPager
Помогите пожалуйста. Использую эту фичу в своей программе(пример один и его...

ViewPager
Всем. Да я недалекий и тупой, уже дня три не могу никак понять :wall: Есть...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru