Ограничение страницы для просмотра 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" становится истинным.