0

Я реализовал операцию, которая отображает фрагменты в viewpager. Первоначально активность отображает 5 фрагментов данного типа (тип A). Каждый фрагмент типа A содержит список информации. При нажатии кнопки фрагменты заменяются на другой фрагмент фрагмента, тип B (т. Е. Загружаются фрагменты, которые используют разный макет и отображают различную информацию).Ошибка производительности производительности FragmentStatePagerAdapter

Я реализовал это с помощью ViewPager и пользовательского FragmentStatePagerAdapter. Пользовательский FragmentStatePagerAdapter переопределяет функции getCount, instantiateItem, getItem, getItemPosition и т. Д., И все работает нормально. Когда я нажимаю кнопку, представления переключаются с фрагмента типа A на фрагмент типа B. Для этого я использую транзакцию с заменой фрагмента, и я также вызываю notifyDataSetChanged на адаптере. Переключение с фрагментов типа A на тип B выполняется путем проверки того, какой тип фрагмента мне нужно создать в функции getItem адаптера. Проблема заключается в том, что процесс переключения (т. Е. Переход от типа фрагмента A к фрагменту типа B и наоборот) занимает некоторое время (около 2 секунд) - эта задержка довольно заметна и раздражает.

Это происходит потому, что функция getItemPosition адаптера возвращает POSITION_NONE. Когда POSITION_NONE возвращается, viewPager воссоздает фрагмент. Кроме того, когда выполняется транзакция замены, все элементы адаптера удаляются и все новые воссоздаются. То же самое происходит, когда я возвращаюсь к фрагментам типа A.

Кто-нибудь знает, есть ли лучший или более быстрый способ сделать это? Использование FragmentPagerAdapter не должно быть хорошим решением, так как количество фрагментов в viewPager может расти.

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

+0

Как я понимаю, у вас есть два уровня «Фрагменты». Почему вы не создаете второй «ViewPager» для ваших «Фрагментов» типа B? Чем у вас на каждом уровне есть собственный «ViewPager» и «FragmentStatePageAdapter», и вам не нужно заботиться о том, какой экземпляр «Фрагмент» должен быть создан. – owe

+0

Фрагменты типа A отображают список значений. Фрагменты типа B отображают график, соответствующий каждому набору значений. Например, у меня есть продажи для местоположения 1, продажи для местоположения 2 и т. Д. До места 5. Когда я нажимаю кнопку, цифры продаж заменяются графиком продаж для местоположения 1, 2, 3 .. 5. Если я я просматриваю продажи для местоположения 4 и нажимаю кнопку, я иду в диаграмму продаж для местоположения 4. Прокрутка влево или вправо приведет меня к диаграмме 5 или 3. Как это работает, проблема в скорости. Я что-то упускаю? Что, если мне нужно отобразить 50 мест в какой-то момент? – user501223

+0

Я не думаю, что вам нужно беспокоиться о количестве мест, которые вы хотите отобразить. Api из «FragmentStatePagerAdapter» говорит: «Эта версия пейджера более полезна, когда имеется большое количество страниц, больше похоже на просмотр списка. Когда страницы не видны пользователю, весь их фрагмент может быть уничтожен, сохраняя сохраненное состояние этого фрагмента, что позволяет пейджеру удерживать гораздо меньше памяти, связанную с каждой посещенной страницей, по сравнению с FragmentPagerAdapter за счет потенциально большего количества накладных расходов при переключении между страницами ». – owe

ответ

0

ViewPager instatiates по умолчанию minimun count Fragments. В общем, левый и правый один из текущего Fragment. Поэтому вам не нужно заботиться об общем количестве Fragments.

Вы можете управлять общим числом с помощью метода ViewPager.setOffScreenPageLimit().

Также рекомендуется использовать AsyncTask, чтобы управлять интенсивной работой вашего Fragments.

Смежные вопросы