2011-09-15 46 views
132

我在我的應用程序中使用ViewPager並在主Activity中定義它。裏面onCreate方法我加載從SharedPreferences的網頁上有編號,然後將它傳遞給PagerAdapter:如何更改ViewPager的頁面?

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

的問題是,如果我想在首這個數字(或其他活動)更改爲其他小於頁索引我之前看過,我的應用崩潰了,因爲這個索引超出了這個ViewPager的活動範圍。它可以通過更改活動的ViewPager頁面來修復。有什麼辦法可以做到嗎?

回答

345

我不確定我是否完全理解這個問題,但從您的問題的標題中,我猜你正在尋找的是pager.setCurrentItem(num)。這允許您以編程方式切換到ViewPager內的另一個頁面。

如果這不是問題,我需要從logcat中看到堆棧跟蹤更具體。

+2

是的,那正是我需要的。我在'onPause'方法中將它設置爲'0',並且沒有崩潰。謝謝。 – Roman

+0

ViewPager上的文檔確實非常少。 +1。 –

+1

如果您的尋呼機拿很多時間加載頁面比你可以從當前位置 –

14

如果不檢查您的代碼,我認爲您所描述的是您的頁面不同步,並且您的數據過時。

你說你正在改變頁數,然後崩潰,因爲你正在訪問舊的一組頁面。這聽起來像你在更改你的數據後沒有調用pageAdapter.notifyDataSetChanged()

當您的viewPager顯示一組10頁的第3頁,並且您更改爲只有5的一組時,請致電notifyDataSetChanged(),您會發現您正在查看新組的第3頁。如果您之前查看舊套件的第8頁,則在放入新套件並致電notifyDataSetChanged()後,您會發現您現在正在查看新套件的最後一頁而不會崩潰。

如果您只是更改當前頁面,則可能只是掩蓋了該問題。

+0

加1 notifyDataSetChanged() –

9

用於切換到另一個網頁,嘗試使用此代碼:

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

完美的使用setOffscreenPageLimit(1),因爲默認情況下視圖尋呼機負荷+1和-1頁面!我試圖使用它沒有postDelay方法,它不起作用。你知道爲什麼它使用這種方法嗎?謝謝! :) –

2

參考答案

我本來有麻煩來自其他類的方法到ViewPager一個參考,因爲addOnTabSelectedListener做出了匿名內部類,這又要求ViewPager變量被聲明爲final。解決方案是使用類成員變量,而不是使用匿名內部類。

public class MainActivity extends AppCompatActivity { 

    TabLayout tabLayout; 
    ViewPager viewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
     tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); 
     tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); 
     tabLayout.addTab(tabLayout.newTab().setText("Tab 3")); 
     tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

     viewPager = (ViewPager) findViewById(R.id.pager); 
     final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount()); 
     viewPager.setAdapter(adapter); 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 

     // don't use an anonymous inner class here 
     tabLayout.addOnTabSelectedListener(tabListener); 

    } 

    TabLayout.OnTabSelectedListener tabListener = new TabLayout.OnTabSelectedListener() { 

     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }; 

    // The view pager can now be accessed here, too. 
    public void someMethod() { 
     viewPager.setCurrentItem(0); 
    } 

} 
8

向右

viewPager.arrowScroll(View.FOCUS_RIGHT)滑動;

滑動到左

viewPager.arrowScroll(View.FOCUS_LEFT);

+0

簡潔乾淨! – dakshbhatt21

相關問題