Страница 1 из 1
Динамическое изменение ViewPager
Добавлено: 19 июл 2012, 11:28
maxim
Есть ViewPager с 3-мя страницами созданный по статье
http://habrahabr.ru/post/131889/ как удалить Page? В SamplePagerAdapter добавил метод RemovePage где удаляю 2 page. В результате работы процедуры 2 page не удаляется а очищается, становиться пустым т.е. остается 3 страницы из которых средняя пустая. Может подскажет кто, как можно удалить 2-ую страницу?
Код: Выделить всё
public void RemovePage(View collection){
int position = 1;
destroyItem(collection, 0, pages.get(position));
pages.remove(position);
notifyDataSetChanged();
};
Re: Динамическое изменение ViewPager
Добавлено: 19 июл 2012, 12:31
rezak90
могу ошибаться, но попробуй метод refreshDrawableState()
Re: Динамическое изменение ViewPager
Добавлено: 19 июл 2012, 12:52
AndreyI
ViewPager используется для отображения данных, а адаптер связывает эти данные со страницами, подобно как в ListView, только там не страницы, а элементы списка. Т.е. сколько у вас данных, столько и страниц будет отображено.
Думаю от данных и нужно плясать. Удалять страницу нужно в ArrayList где содержатся данные ваших страниц и вызвать метод адаптера уведомляющего его, что данные изменились notifyDataSetChanged ()
Re: Динамическое изменение ViewPager
Добавлено: 19 июл 2012, 13:53
maxim
rezak90 писал(а):могу ошибаться, но попробуй метод refreshDrawableState()
Ни каких изменений, может еще что?
rezak90 писал(а):ViewPager используется для отображения данных, а адаптер связывает эти данные со страницами, подобно как в ListView, только там не страницы, а элементы списка. Т.е. сколько у вас данных, столько и страниц будет отображено.
Думаю от данных и нужно плясать. Удалять страницу нужно в ArrayList где содержатся данные ваших страниц и вызвать метод адаптера уведомляющего его, что данные изменились notifyDataSetChanged ()
В том и дело с ListView и разными типами адаптеров полностью разобрался и проблем никаких не возникало все логично и просто, работает и через массив, и через ДБ курсор все динамически удаляется/добавляется. А вот с ViewPager большая проблема он толи кэширует, толи копирует View.
В адаптере после удаления страницы pages.remove(position) (List<View> pages;) вызываю notifyDataSetChanged () а изменений никаких, точнее они есть но не совсем то что нужно.
Re: Динамическое изменение ViewPager
Добавлено: 19 июл 2012, 15:47
KamiSempai
Мне кажется, что строка
Код: Выделить всё
destroyItem(collection, 0, pages.get(position));
здесь совершенно лишняя.
Re: Динамическое изменение ViewPager
Добавлено: 19 июл 2012, 16:05
maxim
KamiSempai писал(а):Мне кажется, что строка
Код: Выделить всё
destroyItem(collection, 0, pages.get(position));
здесь совершенно лишняя.
Может быть... но если её убрать то тоже не работает! В переопределенном методе destroyItem единственная строка
Код: Выделить всё
public void destroyItem(View collection, int position, Object view) {
((ViewPager) collection).removeView((View) view);
}
она удаляет View из набора ViewPager, можно еще по позиции
Код: Выделить всё
((ViewPager) collection).removeAs(int index);
т.е. именно этот метод и делает страницу пустой, но при этом не удаляет её.
Re: Динамическое изменение ViewPager
Добавлено: 19 июл 2012, 16:20
AndreyI
Конечно кеширует, чтобы правильно отобразить переход он должен хранить в памяти страницы, ту что до текущей и ту, что после текущей, те страницы, которые уже не нужны он удаляет вызовом destroyItem. В случае с 3-мя страницами они все хранятся в памяти и не уничтожаются, метод destroyItem не должен вызывается.
Нужно инициировать перезагрузку ViewPager полностью. Это можно сделать, к примеру, если переопределить в адаптере метод getItemPosition:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
тогда вызов метода notifyDataSetChanged () вызовет удаление всех View и перезагрузит их заново с новыми данными.
ЗЫ Принудительно вызывать destroyItem действительно будет лишним
Re: Динамическое изменение ViewPager
Добавлено: 24 июл 2012, 19:08
maxim
AndreyI писал(а):Код: Выделить всё
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
Это то что нужно, переопределив этот метод все заработало. Спасибо всем!