2012-08-09 72 views

回答

121

我已經找到一種方法來設置它的位置,它是在課堂外完成:

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

,它可以通過計算我要適應它的項目的數量限制

+4

請注意,如果'awesomeAdapter'由Cursor/LoaderManager支持,則需要注意何時調用'setCurrentItem'以避免竊取焦點(太遲)或根本無法移動頁面(太早) - 看到[這](http://stackoverflow.com/a/24174114/404960) – rymo 2014-06-12 14:46:42

+0

沒有爲我工作,因爲我的其他片段還沒有準備好在那一點,我有一個例外,因爲我的應用程序試圖使用來自尚未創建的'currentPosition'片段的變量 – Zvi 2016-04-18 19:04:39

+0

完美工作。 當片段準備就緒時,設置視圖分頁器可以正常工作,當片段準備就緒並且可以使用當前位置時試過。謝謝@Kirill – 2016-10-25 13:04:12

7

我碰到一個問題就來了,由此,如果我設置當前項目之前,我設置適配器,我回去將永遠是一個在位0

做的第一個項目一定要做到:

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

,而不是:

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

我已經注意到,如果你重新創建活動(方向變化)和具有FragmentStatePagerAdapter ViewPager,則適配器將重新使用它的碎片。停止它的方式是:

@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 alwayes後打開0頁第一和setCurrentItem(CurrentPosition);不起作用。修正了被延遲後改變頁面:

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

在'recreate()調用'後確實需要延遲! :) – Annihil 2018-01-13 15:16:01

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; 
} 
3

我使用的3個片段,並在開始我的應用程序,第二個(中間)片段將被默認顯示。只是我使用onResume函數,並且所有的工作都很棒。

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

爲我工作,而不是在onCreate中使用一個計時器。謝謝! – Gmeister4 2016-03-06 12:28:12

+0

沒有爲我工作,因爲我的第二個片段沒有準備好在那一點,我有一個異常,因爲我的應用程序試圖使用尚未創建的第二個片段的變量 – Zvi 2016-04-18 19:02:48

+0

因此,如何使用變量甚至創建?! – Leebeedev 2016-04-19 08:31:34

7

首先我這樣做的最後一個片段:

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

我有大小1000餘數組和dymanic viewpager我面臨leftswipe憋屈firstload。下面的代碼解決了這個問題並導致了滾動:

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

我遇到了同樣的問題。 當我初始化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); 
     } 
} 

這樣一來,也從未與延時時間設定麻煩。