ViewPager + Adapter in Fragment => laggy swiping

У меня есть ViewPager с некоторыми фрагментами. Каждый фрагмент имеет ListView в SlidingDrawer (= невидимый перед прокруткой) с ArrayAdapter.

Адаптер установлен на onCreateView(), что замедляет прокрутку, потому что 30 элементов списка приходится загружать каждый раз, когда я прокручиваю, потому что создаются новые фрагменты.

Мой вопрос: можно ли установить адаптер после прокрутки, когда он ViewPager неактивен? Или есть лучший способ? Список должен быть уже загружен при расширении SlidingDrawer.

Ответ 1

Мой вопрос: возможно ли установить адаптер после прокрутки когда пейджер простаивает?

Существует OnPageChangeListener, который вы можете установить на ViewPager, чтобы отслеживать жесты салфетки. Затем вы можете использовать метод onPageSelected() (или onPageScrollStateChanged() для мониторинга текущего состояния), чтобы получать уведомление, когда была выбрана новая страница, и начать с этого метода загрузку данных.

Кроме того, убедитесь, что ListView несут ответственность за задержку, а не какую-либо другую часть вашего кода.

Ответ 2

У меня была аналогичная проблема... Я использовал слушателей. Тем не менее, когда вы прокручиваете две страницы назад, это было лагги... Я сделал что-то подобное, улучшив опыт.

viewpager.setOnPageChangeListener(new OnPageChangeListener() {
    int positionCurrent;
    boolean dontLoadList;
    @Override
    public void onPageScrollStateChanged(int state) {   
        if(state == 0){ // the viewpager is idle as swipping ended
                new Handler().postDelayed(new Runnable() {
                    public void run() {
                        if(!dontLoadList){
                        //async thread code to execute loading the list... 
                        }
                    }
                },200);
            }
        }
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        positionCurrent = position; 
        if( positionOffset == 0 && positionOffsetPixels == 0 ) // the offset is zero when the swiping ends{
            dontLoadList = false;
        }
        else
            dontLoadList = true; // To avoid loading content for list after swiping the pager.
    }

}

Если вы заработаете несколько миллисекунд, чтобы загрузить список, который поставляется в качестве дополнения к viewpager, это нормально с точки зрения UX, а не с плохой проверкой... Итак, идея состоит в том, чтобы ждать 400 мс в потоке перед загрузкой списка и убедитесь, что вы фактически не загружаете контент, когда пользователь пытается быстро пронести, чтобы увидеть содержимое viewpager...