Урок 125. ViewPager

Обсуждение уроков
Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 125. ViewPager

Сообщение klblk » 15 июн 2013, 19:18

igrok-vip писал(а):Не, не в этом дело. Если допустим удалить первую страницу находясь на нулевой, то ошибка сразу не появляется, а только при пролистывании на эту страницу. Получается страница как бы удалена, но "viewpager об этом не знает" или типо того.
И главное ошибка даже если чуть-чуть потянуть и отпустить назад на нулевую)
врядли поможет, но можно попробовать notifyDataSetChanged () вызвать у адаптера после удаления фрагмента.

igrok-vip
Сообщения: 56
Зарегистрирован: 29 апр 2013, 11:53

Re: Урок 125. ViewPager

Сообщение igrok-vip » 16 июн 2013, 09:23

Ага уже попробовал. Не помогает.

gorod
Сообщения: 10
Зарегистрирован: 04 июн 2013, 11:34

Re: Урок 125. ViewPager

Сообщение gorod » 16 июн 2013, 14:10

Здравствуйте!

Бьюсь над тем, чтобы реализовать программное перелистывание ViewPager.
klblk посоветовал это сделать с помощью timer+handler.
Вот то, что получилось в MainActivity.java.
Проект запускается, но программное перелистывание не работает.
Подскажите, пожалуйста, кто знает, в чем причина?

package com.example.viewpage1;

import java.util.Timer;
import java.util.TimerTask;


import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.widget.ImageButton;

public class MainActivity extends FragmentActivity {

static final String TAG = "myLogs";
static final int PAGE_COUNT = 10;

ViewPager pager;
PagerAdapter pagerAdapter;
Timer timer = new Timer();
Handler h2 = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer.schedule(new TimerTask() {
@Override
public void run() {
h2.postDelayed(this, 3000);
h2.sendEmptyMessage(0);
}
}, 0, 3000);


pager = (ViewPager) findViewById(R.id.pager);
pagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
pager.setAdapter(pagerAdapter);
pager.setCurrentItem(0);

pager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int position) {
Log.d(TAG, "onPageSelected, position = " + position);
}

@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}

@Override
public void onPageScrollStateChanged(int state) {
}
});
}

private class MyFragmentPagerAdapter extends FragmentPagerAdapter {

public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int position) {
return PageFragment.newInstance(position);
}

@Override
public int getCount() {
return PAGE_COUNT;
}

}

}

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Урок 125. ViewPager

Сообщение klblk » 16 июн 2013, 14:48

Блин... я же написал тему которую нужно почитать в лс... Handler напиши нормально. и "h2.postDelayed(this, 3000);" лишнее я думаю.
И таймер включи уже после того как адаптер построил... в противном случае просто нечего будет перелистываеть

Akv_kiev
Сообщения: 2
Зарегистрирован: 10 окт 2012, 13:48

Re: Урок 125. ViewPager

Сообщение Akv_kiev » 25 июн 2013, 10:41

Подскажите пожалуйста, как реализовать такой функционал:
На ViewPager имеются две странички, одна из которых - ListView. На второй страничке я могу задать определенную позицию и чтобы при свайпе на первую страничку ListView уже был установлен на эту позицию. Пробовал передавать ссылку на список во второй фрагмент и там устанавливать позицию с помощью smoothScrollToPosition - но получал NullPointerException :(

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

Re: Урок 125. ViewPager

Сообщение KamiSempai » 25 июн 2013, 12:12

Akv_kiev писал(а):Подскажите пожалуйста, как реализовать такой функционал:
На ViewPager имеются две странички, одна из которых - ListView. На второй страничке я могу задать определенную позицию и чтобы при свайпе на первую страничку ListView уже был установлен на эту позицию. Пробовал передавать ссылку на список во второй фрагмент и там устанавливать позицию с помощью smoothScrollToPosition - но получал NullPointerException :(
Очевидно, что когда Вы обращаетесь к списку он еще не создан. Такое бывает с фрагментами в ViewPager, так как метод onCreateView вызывается только когда действительно нужно отобразить фрагмент на экране.

Тут выход только один. Проверять список на null. Если null, записывать позицию в специальную переменную и перематывать список в момент его создания в onCreateView.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Alexander131700
Сообщения: 2
Зарегистрирован: 27 июн 2013, 01:37

Re: Урок 125. ViewPager

Сообщение Alexander131700 » 10 июл 2013, 06:02

Подскажите пожалуйста,как реализовать функционал viewPager только в альбомной ориентации?
мне только требуется чтобы на каждой странице показывалась картина на весь экран, и кнопка. Все страницы формируются динамически в коде. управление только жестами. я почему спрашиваю , кажется и педжер и флипер работают только в портретной ориентации.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 125. ViewPager

Сообщение anber » 10 июл 2013, 12:34

Alexander131700 писал(а):Подскажите пожалуйста,как реализовать функционал viewPager только в альбомной ориентации?
мне только требуется чтобы на каждой странице показывалась картина на весь экран, и кнопка. Все страницы формируются динамически в коде. управление только жестами. я почему спрашиваю , кажется и педжер и флипер работают только в портретной ориентации.
У меня все работает в обоих ориентациях. :roll:

Возможно вам нужно чтобы ViewPager скролился сверху-вниз?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

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

Re: Урок 125. ViewPager

Сообщение assan » 12 июл 2013, 15:56

есть ViewPeger
необходимо обновить на одной из страниц что-то
открывается на 1 странице, пролистываю на 6, пытаюсь обновить - не фига,
прехожу на 7, и возвращаюсь на 6, пытаюсь обновить - обновляет.
т.е. те страницы , которые просматривали-1 можно обновить.
как выйти из этого ?

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Урок 125. ViewPager

Сообщение anber » 12 июл 2013, 16:03

assan писал(а):есть ViewPeger
необходимо обновить на одной из страниц что-то
открывается на 1 странице, пролистываю на 6, пытаюсь обновить - не фига,
прехожу на 7, и возвращаюсь на 6, пытаюсь обновить - обновляет.
т.е. те страницы , которые просматривали-1 можно обновить.
как выйти из этого ?
Не так быстро, я за тобой не успеваю...
Итак есть ViewPager из примера к уроку. Т.е. он использует фрагменты. И ты хочешь обновить текущий фрагмент, скажем поменять текст в TextView, но когда ты это проделываешь ничего не падает но текст не меняется, так?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

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

Re: Урок 125. ViewPager

Сообщение assan » 12 июл 2013, 16:34

anber писал(а):
assan писал(а):есть ViewPeger
необходимо обновить на одной из страниц что-то
открывается на 1 странице, пролистываю на 6, пытаюсь обновить - не фига,
прехожу на 7, и возвращаюсь на 6, пытаюсь обновить - обновляет.
т.е. те страницы , которые просматривали-1 можно обновить.
как выйти из этого ?
Не так быстро, я за тобой не успеваю...
Итак есть ViewPager из примера к уроку. Т.е. он использует фрагменты. И ты хочешь обновить текущий фрагмент, скажем поменять текст в TextView, но когда ты это проделываешь ничего не падает но текст не меняется, так?
да пример из урока (последний варант, который не хранит в памяти)
повторюсь
при переходе на страницу больше чем певаяОткрытая+1
т.е. начально открытая 1, при переходе на 2, обновление не происходит,при дебаге видно , что на этой странице ничего не находит,
если сдвинуться но следующию и вернуться назад, при дебаге видно, что поиск успешен.

т.е. на экране она есть, а на самом деле её нет...

тут http://android-developers.blogspot.ru/2 ... pager.html
это
If you’re trying to replace Views in your ViewPager, it isn’t enough just to change the data set behind the adapter and call notifyDataSetChanged(). You also need to ensure that you’ve correctly implemented getItemPosition(Object object) and return POSITION_NONE for items that have changed and return POSITION_UNCHANGED or the actual position for items that haven’t changed.

но как это прикрутить..

с одной частью разобрался
дело в том, что в памяти находится только 3 страницы.
и такое ViewPager pager = (ViewPager) activity.findViewById(R.id.pager); не берет ту страницу, которая отображается...
чтобы получить отображаемую страницу нужно сделать так(с учетом 0 страницы)

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

ViewPager pager = (ViewPager) activity.findViewById(R.id.pager);
int g=(pager.getCurrentItem()==0)?0:1;
View view=pager.getChildAt(g);
эта view и есть отображаемая страница на которой можно искать и изменять.

другая часть - как сохранить изменения? сделанные изменения , при переходе между страницами не сохраняются.

Анна Антонова
Сообщения: 7
Зарегистрирован: 16 июн 2013, 16:02

Re: Урок 125. ViewPager

Сообщение Анна Антонова » 16 июл 2013, 16:16

А насколько просто вот этой штукой решить задачу пролистывания большого текста? Например, книги. Есть текстовый файл, который надо постранично просмотреть. Но если генерить содержимое каждого фрагмента вручную, то как предусмотреть разные размеры экранов, на которые влезает разное количество буковок? Или, может, у этой задачи есть более простое и изящное решение под 2.3.3?

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

Re: Урок 125. ViewPager

Сообщение Dmitry88 » 28 июл 2013, 12:51

подскажите пожалуйста, как сделать чтобы страница при отображении занимала не весь экран, а только часть и при этом была видна частично следующая страница (например как в приложении ВКонтакте при открытии меню слева)?

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

Re: Урок 125. ViewPager

Сообщение assan » 28 июл 2013, 20:14

Dmitry88 писал(а):подскажите пожалуйста, как сделать чтобы страница при отображении занимала не весь экран, а только часть и при этом была видна частично следующая страница (например как в приложении ВКонтакте при открытии меню слева)?
возникает вопрос - следующая это которавя ? по возрастанию или по убыванию?
сделать ViewPagrer только частью экрана во фрейме, еще один слой ниже , ине нем отображать "следующую страницу"
определиться , что сначит следующая страница и на момент, клгда она строится - строить еще один экземпляр этой страницы в "нижнем слое"

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

Re: Урок 125. ViewPager

Сообщение Dmitry88 » 28 июл 2013, 20:30

возникает вопрос - следующая это которая ? по возрастанию или по убыванию?
извиняюсь за некорректное объяснение. Под "следующей страницей" я имел ввиду ту, на которой мы находились в момент, до того как начали листать. Мне необходимо сделать так, чтобы одна активити была главной, а другая была в качестве навигационного меню и вызывалась при помощи ViewPager, проводя пальцем по экрану вправо, но только так, чтобы не занимала весь экран телефона, а лишь часть. Надеюсь никого не запутал :)

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

Re: Урок 125. ViewPager

Сообщение assan » 28 июл 2013, 20:46

Dmitry88 писал(а):
возникает вопрос - следующая это которая ? по возрастанию или по убыванию?
извиняюсь за некорректное объяснение. Под "следующей страницей" я имел ввиду ту, на которой мы находились в момент, до того как начали листать. Мне необходимо сделать так, чтобы одна активити была главной, а другая была в качестве навигационного меню и вызывалась при помощи ViewPager, проводя пальцем по экрану вправо, но только так, чтобы не занимала весь экран телефона, а лишь часть. Надеюсь никого не запутал :)
всё равно не дошло...
тебе надо чтоб при движении по экрану выдвинулось навигационное меню?
и выдвинулось только на часть экрана?
если так то ViewPager здесь не при делах
тут решатся анимацией выдвижения слоя

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

Re: Урок 125. ViewPager

Сообщение Dmitry88 » 28 июл 2013, 20:58

всё равно не дошло...
тебе надо чтоб при движении по экрану выдвинулось навигационное меню?
и выдвинулось только на часть экрана?
если так то ViewPager здесь не при делах
тут решатся анимацией выдвижения слоя
даа, именно так надо. спасибо за подсказку, буду копаться с анимацией значит)

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

Re: Урок 125. ViewPager

Сообщение assan » 28 июл 2013, 21:13

когда будешь "Сдвигать слой" влево (т.е. прятать за экран) его не достаточно сдвинут, его надо ещё сделать нулевой ширины
простой сдвиг только делает его не видимым, но не деает прозрачным для нажатий и прочих манипуляций палцами по экрану

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

Re: Урок 125. ViewPager

Сообщение Dmitry88 » 30 июл 2013, 15:54

В поисках решения своей проблемы наткнулся вот на что: http://www.youtube.com/watch?v=z3QE74xRxp8 и http://blog.stylingandroid.com/archives/1793 .
В первом случае используется библиотека ActionBarSherlock, но суть одна - ключ к использованию выдвижного меню лежит через DrawerLayout. Также на офсайте нашел-таки необходимую информацию: тыц, тут пример менее нагружен лишним кодом - самое оно для изучения интересующего вопроса, коротко и по делу))
Может кому пригодится ;)

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

Re: Урок 125. ViewPager

Сообщение assan » 30 июл 2013, 20:46

значит у меня намного проще, через анимацию, в любую сторону.

Ответить