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) если вы действительно не заботитесь о плавной прокрутке.

Другие вопросы по тегам