Урок 125. ViewPager

Обсуждение уроков
Dmitry88
Сообщения: 16
Зарегистрирован: 14 июл 2013, 12:22
Откуда: Москва

Re: Урок 125. ViewPager

Сообщение Dmitry88 » 30 июл 2013, 21:44

assan писал(а):значит у меня намного проще, через анимацию, в любую сторону.
не поделишься кодом? Очень любопытно как ты это сделал)

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

Re: Урок 125. ViewPager

Сообщение rezak90 » 30 июл 2013, 22:13

так что за велосипеды? SlidingMenu скачали, установили, какой ViewPager? Всё просто и доступно =)
R.id.team
Политика на форуме запрещена

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 125. ViewPager

Сообщение Mikhail_dev » 30 июл 2013, 22:51

Ну вот, пришел он и разрушил все извращения...

Dmitry88
Сообщения: 16
Зарегистрирован: 14 июл 2013, 12:22
Откуда: Москва

Re: Урок 125. ViewPager

Сообщение Dmitry88 » 30 июл 2013, 22:52

rezak90 писал(а):так что за велосипеды? SlidingMenu скачали, установили, какой ViewPager? Всё просто и доступно =)
а ViewPager уже и ни причем тут, разговор конечно немного не по теме зашел, но все-таки тема приближенная :roll: К тому же ситуации разные бывают, возможно в каких-то конкретных случаях подойдет определенный способ, всегда полезно знать альтернатиные варианты :D

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

Re: Урок 125. ViewPager

Сообщение rezak90 » 30 июл 2013, 22:57

велосипед альтернатива авто? в некой степени да, но в 1 случае из ста
R.id.team
Политика на форуме запрещена

assan
Сообщения: 48
Зарегистрирован: 24 мар 2013, 22:31

Re: Урок 125. ViewPager

Сообщение assan » 31 июл 2013, 08:36

есть три "плана" анимации
1) tree_mov_left.xml

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

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="false">
    <translate
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:fromXDelta="0"
            android:toXDelta="-100%"
            android:fillAfter="true"
            android:duration="500">
    </translate>
    <scale
            android:duration="20"
            android:startOffset="500"
            android:fromXScale="1.0"
            android:fromYScale="1.0"
            android:interpolator="@android:anim/accelerate_decelerate_interpolator"
            android:pivotX="0"
            android:pivotY="0"
            android:toXScale="0"
            android:toYScale="1.0"/>
</set>
2) tree_mov_left_b.xml (прячет "без анимации" применяется один раз, если не надо показывать фрэйм при открытии)

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

<?xml version="1.0" encoding="utf-8"?>
<translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromXDelta="0"
        android:toXDelta="-100%"
        android:fillAfter="true"
        android:duration="0">
</translate>
3) tree_mov_right.xml

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

<?xml version="1.0" encoding="utf-8"?>

<translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromXDelta="-100%"
        android:toXDelta="0"
        android:fillAfter="true"
        android:duration="500">
</translate>
есть фрэйм (но можно любой), на котором всё что нужно,
в начале его прячем (если он не нужен первоначально)

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

 fr = (FrameLayout) findViewById(R.id.fr);
 anim = AnimationUtils.loadAnimation(this, R.anim.tree_mov_left_b);
 fr.setVisibility(View.GONE);
 fr.startAnimation(anim);
есть кнопка (но без разницы на какое действие обрабатывать)

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

 button= (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (fr.getVisibility() == View.GONE) {
                    ccr();
                } else {
                    ccl();
                }
            }
        });

 private void ccr() {
        fr.setVisibility(View.VISIBLE);
        Animation anim = AnimationUtils.loadAnimation(this, R.anim.tree_mov_right);
        fr.startAnimation(anim);
    }

    
public void ccl() {
        Animation anim = AnimationUtils.loadAnimation(this, R.anim.tree_mov_left);
        fr.startAnimation(anim);
        fr.setVisibility(View.GONE);
    }

fr.setVisibility используется как переменная (поле)
меняя планы анимации, можно убирать и показывать любым методом (сверху, снизу, закручиванием и как придет фантазия в голову)
надо учитывать что layout это "слоеный пирог" и тот слой, что описан в самом низу xml файла , на экране - самый верхний слой (если положить планшетник на стол :) )

Andrew
Сообщения: 3
Зарегистрирован: 06 июн 2013, 11:37

Re: Урок 125. ViewPager

Сообщение Andrew » 15 авг 2013, 11:57

Ув форумчане,
никак не могу сообразить: Создал активити, и фрагменты. При создании фрагментов (перелистывании) берется один и тот же .xml файл. Как сделать так, чтобы после создания фрагмента я мог создать в нем нужные мне вьюшки? Сразу создать нельзя, т.к. они будут время от времени меняться(их количество)?

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

Re: Урок 125. ViewPager

Сообщение shtil » 15 авг 2013, 16:15

Всем привет. Подскажите, если мне надо во фрагмент передавать кроме номера страницы еще и дополнительную информацию, как это правильно сделать?
Спасибо

sarnakov
Сообщения: 1
Зарегистрирован: 16 авг 2013, 13:37

Re: Урок 125. ViewPager

Сообщение sarnakov » 16 авг 2013, 14:12

Доброго времени суток!
В этом уроке вы показали, как загружать в ViewPager с первой странницы, но как загрузить с какой-нибудь другой странницы и при этом с возможностью возвращаться на предыдущие?
Спасибо.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 125. ViewPager

Сообщение Mikhail_dev » 16 авг 2013, 14:48

Andrew писал(а):Ув форумчане,
никак не могу сообразить: Создал активити, и фрагменты. При создании фрагментов (перелистывании) берется один и тот же .xml файл. Как сделать так, чтобы после создания фрагмента я мог создать в нем нужные мне вьюшки? Сразу создать нельзя, т.к. они будут время от времени меняться(их количество)?
Кол-во вьюшек меняться будет или кол-во фрагментов?
shtil писал(а):Всем привет. Подскажите, если мне надо во фрагмент передавать кроме номера страницы еще и дополнительную информацию, как это правильно сделать?
Спасибо
Если нужно показать это дело сразу при создании фрагмента, то можно в Bundle засунуть информацию фрагменту, при его создании (но стоит помнить, что конструктор без параметров должен быть обязательно!). Но лично мне такой подход никогда не нравился. Я делаю во фрагменте метод, который заполняет информацию фрагмента. В onCreateView (в нём мы уже имеем доступ ко View элементам) я бросаю BroadCast (или LocalBroadcast, если сделать более безопасно), ловлю его к примеру в активности или во viewPager и уже там вызываю данный метод на заполнение.
sarnakov писал(а):Доброго времени суток!
В этом уроке вы показали, как загружать в ViewPager с первой странницы, но как загрузить с какой-нибудь другой странницы и при этом с возможностью возвращаться на предыдущие?
Спасибо.
С другой страницы, это метод setCurrentItem, куда передаем номер страницы.

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

Re: Урок 125. ViewPager

Сообщение shtil » 16 авг 2013, 15:58

на самом деле у будет количество дней. в каждом дне заполняется listview. хочу сделать через viewpager перелистывание между днями. я могу конечно сделать кучу фрагментов и каждый с базы будет выгребать свою информацию и передать в viewpager, но это наверное забьет память.
Я делаю во фрагменте метод, который заполняет информацию фрагмента.
вот и я хочу так сделать. но во фрагмент передается только номер страницы, а мне надо еще передать туда , например, "день", по которому сделаю выборку с базы и отображу во view.
не найдется ли у вас примера вашей реализации?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 125. ViewPager

Сообщение Mikhail_dev » 16 авг 2013, 16:20

вот и я хочу так сделать. но во фрагмент передается только номер страницы
1. А что вам мешает передавать НЕ ТОЛЬКО номер страницы? Номер же как-то передаётся. Он передаётся через Bundle в уроке. Через этот же Bundle можно передавать сами объекты, например как putParcelable или putSerializable. Можете глянуть какие есть методы в самом Bundle для передачи данных через него.
2. Но если всё же хочется через методы заполнять... Делаем так. В методе onCreateView бросаем Broadcast (getActivity.sendBroadcast(...)), в который можно передать сам номер созданного фрагмента (я так понимаю это у вас номер дня как раз). В активности в самой мы ловим этот бродкаст, дальше достаем номер фрагмента, идём во ViewPager, достаём нужный фрагмент и заполняем его.
я могу конечно сделать кучу фрагментов и каждый с базы будет выгребать свою информацию и передать в viewpager, но это наверное забьет память.
Советую глянуть в том же уроке внизу про FragmentStatePagerAdapter, который хранит только боковые фрагменты.

На счет примера сейчас не подскажу, нету под рукой, да и убегаю..

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

Re: Урок 125. ViewPager

Сообщение shtil » 18 авг 2013, 21:45

спасибо, будем экспериментировать...

EvilAngel
Сообщения: 28
Зарегистрирован: 16 апр 2013, 23:55

Re: Урок 125. ViewPager

Сообщение EvilAngel » 19 авг 2013, 22:25

Спасибо за урок, интересно.
Но жаль только кратковато. И интерес вызывает также сравнительная характеристика ViewPager, ViewAnimator с его потомками ViewFlipper и ViewSwitcher и как производные ImageSwitcher и TextSwitcher на практических примерах. Вроде как ViewAnimator более универсален своих потомков, но разве что не поддерживает ViewFactory как потомки и drag&drop как ViewPager.

SPAWN
Сообщения: 20
Зарегистрирован: 11 мар 2013, 21:59

Re: Урок 125. ViewPager

Сообщение SPAWN » 03 сен 2013, 15:20

Подскажите как обновлять содержимое ViewPager?

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 125. ViewPager

Сообщение Mikhail_dev » 03 сен 2013, 18:47

Что конкретно изменять? Фрагмент? Его представление? Данные во фрагменте? Кол-в фрагментов?

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

Re: Урок 125. ViewPager

Сообщение shtil » 13 сен 2013, 22:34

перечитав урок сделал такое:
1)из базу в курсор вытягиваю id всех записей
2)в FragmentStatePagerAdapter передаю этот курсор
3) в методе getItem вытягиваю id записи и вместе с position передаю в фрагмент
4) в фрагменте получаю id, вытягиваю по нему из базы текст и заполняю TextView.
5) из этого фрагмента я так же получаю доступ до actionbar'а, добавляю кнопки "редактировать" и "удалить". на "редактировать" вешаю вызов другого активити и передаю туда id - тут все нормально.
а вот с "удалить" у меня проблемы. получается имея id - я могу удалить запись с базы, а вот как быть с pageadapter - не знаю. необходимо как то удалять этот фрагмент и перегружать адаптер...
если есть идеи или примеры для работы в таком случаи - только рад узнать.
спасибо.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 125. ViewPager

Сообщение Mikhail_dev » 13 сен 2013, 23:08

Ох, это муторное занятие. Я как-то день убил, понимая как лучше это сделать. Сделал. Правда сделал только смену фрагмента. Вот тема, откуда черпать понимание
http://stackoverflow.com/questions/7723 ... -viewpager

snowkam
Сообщения: 162
Зарегистрирован: 21 мар 2013, 11:22

Re: Урок 125. ViewPager

Сообщение snowkam » 16 сен 2013, 16:02

Привет всем.
Совсем кругом голова идет
Решил сделать пример перелистывание в пейджере записи из базы данных. только не могу понять куда прикрутить курсор и где его обновлять?

Аватара пользователя
shtil
Сообщения: 27
Зарегистрирован: 04 июл 2013, 10:01

Re: Урок 125. ViewPager

Сообщение shtil » 16 сен 2013, 16:13

snowkam писал(а):Привет всем.
Совсем кругом голова идет
Решил сделать пример перелистывание в пейджере записи из базы данных. только не могу понять куда прикрутить курсор и где его обновлять?
посмотри
http://stackoverflow.com/questions/1273 ... d-database

у меня аналогичная задача) но нужно еще и удалять эти записи. с базы удалить не проблема. но столкнулся с этим

Короче я полностью запутался. Получается такая ситуация. Сделал простой адаптер

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

private class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {

		private ArrayList<Integer> mFragmentId;
		
		private SparseArray<WeakReference<PageFragment>> mPageReferenceMap = new SparseArray<WeakReference<PageFragment>>();

		public MyFragmentPagerAdapter(FragmentManager fm, ArrayList<Integer> mFagmentListId) {

			super(fm);
			mFragmentId = mFagmentListId;
			Log.d(LOG_TAG, "start MyFragmentPagerAdapter mFagmentListId.size()="+mFagmentListId.size());
		}

		@Override
		public Fragment getItem(int index) {

			return getFragment(index);
		}

		@Override
		public int getCount() {

			return mFragmentId.size();
		}

		public Object instantiateItem(ViewGroup container, int position) {

			mPageReferenceMap.put(Integer.valueOf(position), new WeakReference<PageFragment>((PageFragment)PageFragment.newInstance(position,Integer.parseInt(mFragmentId.get(position).toString()),mFragmentId.size())));

			return super.instantiateItem(container, position);
		}

		
		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {

			super.destroyItem(container, position, object);
			mPageReferenceMap.remove(Integer.valueOf(position));
		}

		/*
		 * Overriding this method in conjunction with calling
		 * notifyDataSetChanged removes a page from the pager.
		 */
		public int getItemPosition(Object object) {
			Log.d(LOG_TAG, "start getItemPosition ");
		    return POSITION_NONE;
		    
		}

		public PageFragment getFragment(int key) {

			WeakReference<PageFragment> weakReference = mPageReferenceMap.get(key);

			if (null != weakReference) {

				return (PageFragment) weakReference.get();
			}
			else {

				return null;
			}
		}
	}
Тогда делаю такое

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

mFragmentId1 = getListId();

pagerAdapter =  new MyFragmentPagerAdapter(getSupportFragmentManager(),mFragmentId1);//new CursorFragmentPagerAdapter(this,getSupportFragmentManager(),cursor);
		pager.setAdapter(pagerAdapter);
тут все работает. фрагменты создаются, перелистываются как надо что на андроиде 4,2, что на 2,3.
но потом делаю вот такое

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

@Override
	public void onDeleteNoteClick(long id, int position) {		
		
		mFragmentId1.remove(position);
		pagerAdapter.notifyDataSetChanged();


	}
В результате получается, что на андроиде 2.3 - нужный фрагмент удаляется, все перерисовывается и отображаются оставшееся. а вот на андроиде 4,2 - в логах видно, что старые фрагменты удалились и новые создались, а отображаются все равно старые. правда уже без крайнего правого.
Может кто в курсе, от чего такое странное поведение.

Ответить