Endless ViewPager: setCurrentItem(int pos) блокирует пользовательский интерфейс, когда новая позиция меньше текущей по крайней мере на 2
Когда я звоню setCurrentItem(int pos)
метод на ViewPager
с бесконечными предметами, UI
блокируется, если новая позиция меньше текущей по крайней мере на 2. Если новая позиция меньше на 1 или больше старой позиции, ViewPager
работает правильно. Для целей тестирования я изменил максимальное число до 300, UI
не был заблокирован. Это выглядит как ViewPager
перебирает количество элементов, чтобы соответствовать новой позиции с ними, в моем случае количество элементов Integer.MAX_VALUE
, UI
блок длится около 20-30 секунд и затем корректно переходит в нужное положение. Вот адаптер
public class DateCountVPAdapter extends FragmentStatePagerAdapter {
public DateCountVPAdapter(Date startDate, FragmentManager fm) {
super(fm);
this.startDate = startDate;
calendar = Calendar.getInstance();
calendar.setTime(startDate);
}
private Date startDate;
private Calendar calendar;
@Override
public DateCountVPFragment getItem(int position) {
Calendar currentDate = (Calendar)calendar.clone();
currentDate.add(Calendar.DAY_OF_MONTH, position);
return DateCountVPFragment.newInstance(startDate, currentDate.getTime());
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
}
Я тоже пытался продлить ViewPager
и изменить setCurrentItem(int pos)
Метод, однако были частные методы, которые сделали это невозможно. Также я попытался скопировать класс, однако проблема с PagerAdapter
, который имел метод private пакета, используемый ViewPager
, Пожалуйста, предлагайте любые решения, чтобы избежать UI
блок. Заранее спасибо.
1 ответ
По умолчанию, setCurrentItem(int pos)
неявно вызывает, что переход представления должен быть анимирован как плавная прокрутка, если ViewPager
уже прошел первый макет с текущим адаптером. Так что часть вашего времени может быть от ViewPager
пытаясь нарисовать плавную прокрутку между экранами, особенно если это должно создать Fragment
в переходе.
Ваш первый шаг должен использовать setCurrentItem(int pos, boolean smoothScroll)
если вы действительно не заботитесь о плавной прокрутке.