Динамическое изменение ViewPager

Интерфейс, диалоги, темы, стили, меню
Ответить
maxim
Сообщения: 9
Зарегистрирован: 25 июн 2012, 09:31

Динамическое изменение ViewPager

Сообщение maxim » 19 июл 2012, 11:28

Есть 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();
};

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Динамическое изменение ViewPager

Сообщение rezak90 » 19 июл 2012, 12:31

могу ошибаться, но попробуй метод refreshDrawableState()
R.id.team
Политика на форуме запрещена

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Динамическое изменение ViewPager

Сообщение AndreyI » 19 июл 2012, 12:52

ViewPager используется для отображения данных, а адаптер связывает эти данные со страницами, подобно как в ListView, только там не страницы, а элементы списка. Т.е. сколько у вас данных, столько и страниц будет отображено.
Думаю от данных и нужно плясать. Удалять страницу нужно в ArrayList где содержатся данные ваших страниц и вызвать метод адаптера уведомляющего его, что данные изменились notifyDataSetChanged ()

maxim
Сообщения: 9
Зарегистрирован: 25 июн 2012, 09:31

Re: Динамическое изменение ViewPager

Сообщение maxim » 19 июл 2012, 13:53

rezak90 писал(а):могу ошибаться, но попробуй метод refreshDrawableState()
Ни каких изменений, может еще что?
rezak90 писал(а):ViewPager используется для отображения данных, а адаптер связывает эти данные со страницами, подобно как в ListView, только там не страницы, а элементы списка. Т.е. сколько у вас данных, столько и страниц будет отображено.
Думаю от данных и нужно плясать. Удалять страницу нужно в ArrayList где содержатся данные ваших страниц и вызвать метод адаптера уведомляющего его, что данные изменились notifyDataSetChanged ()
В том и дело с ListView и разными типами адаптеров полностью разобрался и проблем никаких не возникало все логично и просто, работает и через массив, и через ДБ курсор все динамически удаляется/добавляется. А вот с ViewPager большая проблема он толи кэширует, толи копирует View.
В адаптере после удаления страницы pages.remove(position) (List<View> pages;) вызываю notifyDataSetChanged () а изменений никаких, точнее они есть но не совсем то что нужно.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Динамическое изменение ViewPager

Сообщение KamiSempai » 19 июл 2012, 15:47

Мне кажется, что строка

Код: Выделить всё

destroyItem(collection, 0, pages.get(position));
здесь совершенно лишняя.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

maxim
Сообщения: 9
Зарегистрирован: 25 июн 2012, 09:31

Re: Динамическое изменение ViewPager

Сообщение maxim » 19 июл 2012, 16:05

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);
т.е. именно этот метод и делает страницу пустой, но при этом не удаляет её.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Динамическое изменение ViewPager

Сообщение AndreyI » 19 июл 2012, 16:20

Конечно кеширует, чтобы правильно отобразить переход он должен хранить в памяти страницы, ту что до текущей и ту, что после текущей, те страницы, которые уже не нужны он удаляет вызовом destroyItem. В случае с 3-мя страницами они все хранятся в памяти и не уничтожаются, метод destroyItem не должен вызывается.
Нужно инициировать перезагрузку ViewPager полностью. Это можно сделать, к примеру, если переопределить в адаптере метод getItemPosition:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
тогда вызов метода notifyDataSetChanged () вызовет удаление всех View и перезагрузит их заново с новыми данными.

ЗЫ Принудительно вызывать destroyItem действительно будет лишним

maxim
Сообщения: 9
Зарегистрирован: 25 июн 2012, 09:31

Re: Динамическое изменение ViewPager

Сообщение maxim » 24 июл 2012, 19:08

AndreyI писал(а):

Код: Выделить всё

@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
Это то что нужно, переопределив этот метод все заработало. Спасибо всем!

Ответить