Ограничение страницы для просмотра ViewPager

Есть ли способ обойти нормальное поведение ViewPager и его ограниченного экрана? Мой ViewPager содержит четыре fragments, каждый из которых содержит gridview изображений. Проблема в том, что при инициализации ViewPager создаются два fragments, что приводит к тому, что примерно 20 изображений (около 10 на фрагмент) загружаются/извлекаются из улова одновременно. Можно ли отключить ограничение экрана на странице?

Моя цель - загружать изображения только при выборе fragment или только когда пользователь наводил изображение. Один из способов добиться этого - использовать прослушиватель onPageSelected и установить флаг, который сообщает GridViewAdapter, если разрешено загрузить изображение или нет.

Второй способ, который я могу придумать, - установить HoverListener на ImageView и загрузить только изображение на onHover, но этот прослушиватель доступен только в 4.0 и более поздних версиях.

Есть ли лучший способ достичь этого?

Ответ 1

Можно ли отключить ограничение экрана на странице?

Нет. Он уже установлен как минимально возможное значение: одна страница с каждой стороны просматриваемой страницы. Это необходимо для того, чтобы эффекты анимации работали - вы одновременно видите части из двух фрагментов (оригинальные и новые).

Моя цель - загружать изображения только при выборе фрагмента или только когда пользователь наводил изображение.

Затем загрузите свою сетку с изображениями-заполнителями и не загружайте реальные изображения до тех пор, пока страница не будет изменена.

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

Ответ 2

Просто установите для параметра offscreen limit значение.

ViewPager mViewpager = (ViewPager)findView....
mViewPager.setOffscreenPageLimit(1);

Ответ 3

Вы также можете сделать это в xml с помощью привязки данных Android:

<android.support.v4.view.ViewPager
    [...]
    app:offscreenPageLimit="@{1}"
    [...]
</android.support.v4.view.ViewPager>

Ответ 4

Ручка viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener()

Внутри, удалите дополнительные представления после position + 1 и до position - 1 с помощью viewPager.removeViewAt(int) (т.е. ограничьте пейджер, чтобы загружать только 3 страницы: текущий, предыдущий и следующий.

Затем вы должны обработать destroyItem в адаптере viewpager, recycle() с растровыми изображениями в разрушенном виде.

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    LinearLayout layout = (LinearLayout) object;
    ((ViewPager) container).removeView(layout);
    ImageView imgDisplay = (ImageView) layout.findViewById(R.id.quranPage);
    Drawable drawable = imgDisplay.getDrawable();
    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        Bitmap bitmap = bitmapDrawable.getBitmap();
        if (bitmap != null) //when reading page fails, this will be null
            bitmap.recycle();
    }
}

Ответ 5

Моя цель - загружать изображения только при выборе фрагмента

Вы можете использовать обратный вызов setUserVisibleHint(boolean isVisibleToUser) фрагмента в вашем ViewPager.

Ответ 6

mViewPager.setOffscreenPageLimit(1); не даст то, что вы хотите, он будет загружать соседний фрагмент, если он уже не загружается (это означает, что он будет загружать 2 фрагмента).

Скажем, если вы хотите сразу загрузить весь фрагмент (4 фрагмента), используйте только setOffscreenPageLimit(3), иначе не используйте setOffscreenPageLimit.

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

Ответ 7

Чтобы избежать загрузки изображений без фактического прокрутки пользователя на фрагмент, вы можете переопределить "setUserVisibilityHint (boolean visibleToUser)" и загружать изображения только в том случае, если "visibleToUser" становится истинным.