2013-05-20 2 views
10

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

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

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

ответ

3

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

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

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

+0

Я прокомментировал вызов setAdapter, и он был более плавным. onPageSelected - хорошая идея, но я получаю только номер позиции, как получить текущий экземпляр Fragment – metinkale38

+0

@ metinkale38. В зависимости от того, какой тип адаптера вы используете, см. два первых ответа в этом вопросе http://stackoverflow.com/questions/7379165/update-data-in-listfragment-as-part-of-viewpager? answertab = votes # tab-top – Luksprog

+0

спасибо OnPageChangeListener - хорошая идея, более гладкая, чем раньше, если я не пропустил сразу 2 страницы после друг друга. По вашей ссылке я нашел эту ссылку: http://tamsler.blogspot.nl/2011/11/android-viewpager-and-fragments-part-ii.html, и я использовал второй метод для получения экземпляра фрагмента – metinkale38

16

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

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 ...