2015-07-07 2 views
1

Скажем, у меня есть viewpager с несколькими фрагментами, которые содержат растровые изображения. Я использую setOffScreenLimit(numberOfPagesInViewPager), чтобы убедиться, что фрагменты мгновенно доступны в любое время (это требование моего приложения). Вполне очевидно, что чем больше фрагментов у меня есть, тем больше памяти я буду использовать из-за растровых изображений внутри фрагментов и фрагментов, хранящихся в памяти.Как повторно использовать фрагменты в viewpager в Android?

Теперь предположим, что эти фрагменты показывают одинаковое содержимое и, следовательно, содержат одинаковые растровые изображения.

Можно ли создать только один фрагмент и повторно использовать его в viewpager для всех страниц (и, следовательно, уменьшить объем памяти до 1 фрагмента)?

В коде я имею в виду что-то вроде этого:

public class MyAdapter extends FragmentPagerAdapter { 

private MyFragment mFragment; 

public MyAdapter(FragmentManager fragmentManager) { 
    super(fragmentManager); 

    mFragment = MyFragment.newInstance(); 
} 

@Override 
public Fragment getItem(int position) { 
    // Reuse mFragment for all pages in the viewpager 
    return mFragment; 
} 
} 

Этот подход не работает, однако, как я получаю этот тип ошибки:

java.lang.IllegalStateException: Can't change tag of fragment MyFragment{4259a4d0 id=0x7f0a0074 android:switcher:2131361908:0}: was android:switcher:2131361908:0 now android:switcher:2131361908:1 

ответ

0

Would it be possible to create only one fragment and reuse it in the viewpager for all pages (and hence reducing the memory footprint to 1 fragment)?

Не с FragmentPagerAdapter и FragmentStatePagerAdapter. И я сомневаюсь, что это сработает даже с вашим собственным заказом PagerAdapter.

Если вы используете приложение с ViewPager, вы заметите, что анимация ViewPager при прокрутке, поэтому вы видите части двух страниц за один раз. Это будет сложно только с одной страницей. Вот почему ViewPager требует не менее трех страниц в любое время, поэтому он может обрабатывать звуковые дорожки в любом направлении.

Помимо этого, я не могу понять, почему пользователи захотят перелистывать серию одинаковых страниц в ViewPager.

0

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

Адаптер фрагментов откровенно более полезен, если каждый из ваших фрагментов имеет разный структурный код.

0

Не на 100% уверены, но я считаю, что фрагменты уничтожаются и воссоздаются по представлению пейджера. Вы можете дважды проверить это в отладчике. Если это так, то фрагмент может быть тонкой оболочкой вокруг растрового изображения, а сама растровая карта может быть кэширована вместо фрагмента. Существует несколько стратегий кэширования растровых изображений, как описано в http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html.

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