Початкове положення PagerAdapter


75

Я використовую наступний приклад, щоб обмежити свій viewPager: http://code.google.com/p/viewpagerexample/issues/list

Проблема цього прикладу полягає в тому, що я не можу зрозуміти, як встановити мою вихідну позицію, початковою позицією за замовчуванням є 0. В основному, я не хочу мати змогу контролювати, чи є зліва або справа доступний вигляд.

Чи є спосіб керувати переглядом поточного положення в центрі? чи є кращий спосіб це зробити? чи можна зробити це круговим?


Відповіді:


169

Я знайшов спосіб встановити його позицію, що робиться поза класом:

 awesomePager = (ViewPager) findViewById(R.id.awesomepager);
 awesomePager.setAdapter(awesomeAdapter);
 awesomePager.setCurrentItem(CurrentPosition);

і його можна обмежити, обчисливши кількість предметів, які я хочу до нього вмістити


4
зауважте, що якщо awesomeAdapterпідтримка курсора / LoaderManager, вам слід бути обережним щодо того, коли setCurrentItemвикликається, щоб уникнути крадіжки фокусу (занадто пізно) або взагалі неможливості переміщення сторінки (занадто рано) - дивіться це
rymo

не працював у мене, оскільки мої інші фрагменти на той момент не готові, і я маю виняток, оскільки мій додаток намагався використовувати змінну з currentPositionфрагмента, який ще не був створений
Zvi

Працює ідеально. Встановлення перегляду пейджера, коли фрагмент готовий, працює нормально, спробував це, коли фрагмент готовий, і у вас є поточна позиція. Дякую @Kirill
Naeem Ibrahim

Чи є спосіб запустити ViewPager з кінця ? Я маю на увазі, як у RecyclerView , коли ви налаштовували new LinearLayoutManager(..., inverse=true). Що я хочу, це: ViewPager негайно перескочити до останнього предмета, без загоряння фрагментів посередині
murt

@murt це досить пізно, але у випадку, якщо хтось має таку ж проблему, передача falseне буде показувати користувачеві перехід, який відбувається: viewPager.setCurrentItem(newPosition, false);
Yousef Gamal

20

Я помітив, що якщо ви відтворюєте Activity (зміна орієнтації) за допомогою ViewPager, який має FragmentStatePagerAdapter, то Адаптер повторно використовуватиме його Fragments. Спосіб зупинити це:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    if (viewPager != null) {
        // before screen rotation it's better to detach pagerAdapter from the ViewPager, so
        // pagerAdapter can remove all old fragments, so they're not reused after rotation.
        viewPager.setAdapter(null);
    }
    super.onSaveInstanceState(savedInstanceState);
}

але потім після активного відпочинку ViewPager завжди відкриває сторінку 0 і встановлюєCurrentItem (CurrentPosition); не працює. Виправлення: зміна сторінки після затримки:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        viewPager.setCurrentItem(newPosition);
    }
}, 100);

Затримка дійсно потрібна після recreate() call! :)
anni

17

Для початку з останнього фрагмента я зробив це:

PagerAdapter pagerAdapter = new PagerAdapter();
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(pagerAdapter.getCount() - 1);

9

Я зіткнувся з проблемою, через яку, якщо я встановлюю поточний елемент перед тим, як встановлювати адаптер, першим елементом, який я повертаю, завжди буде той, що знаходиться в позиції 0.

Обов’язково виконайте такі дії:

awesomePager.setAdapter(awesomeAdapter);
awesomePager.setCurrentItem(CurrentPosition);

і ні:

awesomePager.setCurrentItem(CurrentPosition);
awesomePager.setAdapter(awesomeAdapter);

6

У мене масив розміром більше 1000, і в динамічному візуальному пейджері я стикався з левим штрихом, застрягшим при першому завантаженні. Наведений нижче код вирішив це і призвів до плавної прокрутки:

@Override
onResume(){
   super.onResume();
   viewPager.setCurrentItem(newPosition);
}

4

Я використовую 3 фрагменти, і при запуску програми другий ( середній ) фрагмент буде показаний за замовчуванням. Просто я використовую функцію onResume, і все чудово працює.

@Override
protected void onResume() {
    super.onResume();
    m_viewPager.setCurrentItem(1);
}

Працював у мене на відміну від використання таймера в onCreate. Дякую!
Gmeister4,

не працював у мене, оскільки мій 2-й фрагмент на той момент не готовий, і я маю виняток, оскільки мій додаток намагався використовувати змінну з 2-го фрагмента, який ще не був створений
Zvi

То як ви могли використовувати змінну, яку навіть не створили ?!
Leebeedev

2

Я зіткнувся з такою ж проблемою. Коли я ініціалізую ViewPager, позиція індикатора становила 0. Це може залежати від кількості обчислення вмісту пейджера. Я використовую ViewTreeObserver, як показано нижче.

mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        mViewPager.setCurrentItem(newPosition);
        removeOnGlobalLayoutListener(mSlidingTabLayout.getViewTreeObserver(), mGlobalLayoutListener);
    }
};
mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);

і,

private void removeOnGlobalLayoutListener(ViewTreeObserver observer, ViewTreeObserver.OnGlobalLayoutListener listener) {
       if (observer == null) return;
       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
               observer.removeGlobalOnLayoutListener(listener);
       } else {
               observer.removeOnGlobalLayoutListener(listener);
       }
} 

Таким чином, також ніколи не турбуватися про встановлення часу затримки.


2

Використовуючи viewPager.setCurrentItem(newPosition);показ користувачеві переходу з початкової сторінки на newPosition, щоб запобігти цьому, і показувати newPositionбезпосередньо, ніби це була початкова точка, я додав falseдо другого параметра щось на зразок цього:

int newPosition = pages.size()-1; // Get last page position

viewPager.setCurrentItem(newPosition, false); // 2nd parameter (false) stands for "smoothScroll"

1
@Override
public Object instantiateItem(ViewGroup container, int position) {
    View currentPage = null;
    switch(position){
        case 0:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page0, null)    
            break;
        case 1:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page1, null)    
            ///////////// This page will be default ////////////////////
            ((ViewPager)container).setCurrentItem(position);
            ////////////////////////////////////////////////////////////
            break;
        case 2:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page2, null)    
            break;
    return currentPage;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.