Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Опа!!
14 / 14 / 0
Регистрация: 30.09.2009
Сообщений: 89
#1

Бесконечный ViewPager с тремя элементами - Программирование Android

21.10.2012, 01:59. Просмотров 1040. Ответов 0
Метки нет (Все метки)

Задача - реализовать "бесконечную" прокрутку страниц с использованием ViewPager и PagerAdapter. В качестве элементов выступают View (не Fragment). Все view создаются из единого xml-layout через inflater, отличаются лишь содержанием. Содержание подгружается из API.

В параметрах ViewPager установил ограничение на лимит неактивных страниц слева и справа:
Java
1
mViewPager.setOffscreenPageLimit(1);
Т.о., одновременно могут храниться 1 активная страница и по 1 слева и справа, в случае если их становится больше, вызывается соотв. метод на удаление в PagerAdapter-e. При запуске имеется 1 id, для которого загружается содержание из Интернета с API (картинка + текст). После загрузки первой страницы апи присылает ответ с id следующей страницы, если таковая имеется. id-шники страниц храню в ArrayList<String>: при создании адаптера инициализирую этот список первым значением (id начальной страницы), при получении следующего id добавляю туда следующее значение. Получается, при запуске у меня имеется адаптер, getCount которого возвращает размер этого массива id (mPagesId), в начале он равен 1. Далее адаптер запрашивает 0-вую позицию для ViewPager-a:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  @Override
    public Object instantiateItem(ViewGroup collection, int position) {
       int pageId = Integer.valueOf(mPagesId.get(position));
       View newView = createNewView();
       newView.setId(pageId);
       ((ViewPager) collection).addView(newView);
       // start post loading if there is active network connection
       if (ConnectionUtils.isOnline(mContext)) {
           TaskLoadPost loadPostTask = new TaskLoadPost();
           loadPostTask.execute(pageId);
       } else {
           DialogUtil.showNetworkErrorDialog((Activity) mContext);
       }
       return newView;
    }
В фоне заполняю вьюхи данными из Сети и там же получаю новый id, который добавляю в массив:
Java
1
mPagesId.add(id);
После чего адаптер вновь вызывает метод instantiateItem(...), далее по позиции берется id из массива и все повторяется далее: добавили новое view, загрузили его, загрузили след. Id, поместили в массив и т.д.

На первых шагах все в порядке (рассматриваю только листание вправо сейчас), разве что по достижению 3 или 4 элемента адаптер перед инициализацией новой страницы вызывает метод удаления destroyItem():
Java
1
2
3
4
5
 ((ViewPager) collection).removeView((View) view);
 
    View page = (View) view;
    mPagesId.remove(String.valueOf(page.getId()));
    notifyDataSetChanged();
ОК, удалили, все вроде бы в порядке. После этого размер массива становится равным 3м. Тут начинается самое интересное: после удаления 0 элемента мы в методе initiate вызываемся уже не как логично было бы предполагать со 2 элементом - position == 2 (ведь у нас хранится только 3 страницы), а с 3 - мы лезем по этой позиции за Id, но id там не находим, т.к. массив только что был "сжат". Ну да ладно, думаю, как-нибудь можно выкрутиться. Проскочили, листнули, вновь удалили, снова попадаем в в initiate.. опять же логично ожидать position == 2, 3 ну или черт с ним, 4.. но position приходит равным 1! Что это за единица и откуда и почему она берется - для меня большая загадка. Опять же говнокодом это можно обойти и в случае листания вправо далее вызывается только с позицией = 1 - почему и как мне не ясно.

В общем, суть вопроса: каким образом можно нормально синхронизировать и "подружить" какую-то свою структуру, храняющуюю вспомогательные данные для страниц во ViewPager, с тем поведением, что происходит у ViewPager-a и вызываемыми им методами добавления\удаления с непонятными позициями. Мне действительно нужен дополнительный массив синхронизированный с внутренним хранилищем View во ViewPager, иначе не представляется возможным загружать следующие\предыдущие страницы с API с правильными id-шниками, при этом удаляя ненужные страницы и id. Кто-нибудь сталкивался с чем-то подобным? Может, есть какие-то более элегантные задачи решить мою задачу? Может, я как-то не верно понимаю всю хитрость того, когда и как ViewPager вызывает методы своего адаптера? Для меня эти позиции действительно неясны, а без возможности их предсказания я не могу получать нужные id для загрузки следующих страниц и очистки старых.

Был бы очень благодарен за любой совет, бьюсь над этим уже порядка недели...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2012, 01:59     Бесконечный ViewPager с тремя элементами
Посмотрите здесь:

создание ViewPager - Программирование Android
здравствуйте,возник вопрос по ViewPager. Не получается добавить компоненты после ViewPager, т.е Статический компонент вверху и внизу,а по...

ViewPager Indicator - Программирование Android
Здравствуйте! Взял пример с https://github.com/JakeWharton/Android-ViewPagerIndicator и хотел бы объединить табы с индикатором который...

Поворот ViewPager - Программирование Android
Как повернуть ViewPager на 90 градусов при заблокированной портретной ориентации? Применяю RotateAnimation, но анимация не срабатывает до...

ViewPager и Tab - Программирование Android
Здравствуйте. Есть приложение на андроид C# (файл проекта в приложении). Он нормально функционирует, но возникает проблема при...

Правильный ViewPager - Программирование Android
Вообщем все что я сделал прикрепил на картинке. Беда то вот в чем. Ну например я тыкаю пальцем ну и скролирую, а тыкаю то я в кнопку...

ViewPager автодаводка - Программирование Android
Подскажите пожалст ,как можно изменить автодаводку уменьшить или увеличить?

ViewPager setText - Программирование Android
Приветствую ув.форумчане! Скопировал данный код из startandroid,помогите как сделать, чтобы при каждом слайде был разный текст который...

Сохранение состояния ViewPager - Программирование Android
Есть адаптер: public class QuestionFragmentPagerAdapter extends FragmentPagerAdapter { @Override public Fragment getItem(int...

viewPager onCreate method - Программирование Android
Всем здрасьте, возник следующий вопрос по ViewPager: Создаю viewPager и заполняю его в методе OnCreate главной активити: ...

AsyncTask в Fragment и viewPager - Программирование Android
У меня есть ViewPager который состоит из двух листающихся экранов, есть код фрагмента который запускается в этом viewPager (как правильно...

Изменение Activity из ViewPager - Программирование Android
Добрый день! Есть viewPager, который принимает на вход 3 фрагментов и работает с ними. Активики, в которой расположен viewPager,...

Обновление содержимого ViewPager - Программирование Android
Есть ли какие-нибудь способы обновить содержимое всех страницы ViewPager'а? Придумал только походить пару раз туда обратно по всем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru