簡體   English   中英

如何更改 ViewPager 的頁面?

[英]How to change ViewPager's page?

我在我的應用程序中使用 ViewPager 並在主活動中定義它。 onCreate方法中,我從 SharedPreferences 加載了一些頁面,然后將其傳遞給 PagerAdapter:

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

問題是,如果我將首選項(或其他活動)中的這個數字更改為我之前查看過的其他一些小於頁面索引的數字,我的應用程序會崩潰,因為當我使用此 ViewPager 返回活動時,此索引超出范圍。 它可以通過更改活動的 ViewPager 頁面來修復。 有什么辦法嗎?

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

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

向右滑動

viewPager.arrowScroll(View.FOCUS_RIGHT);

向左滑動

viewPager.arrowScroll(View.FOCUS_LEFT);

不檢查您的代碼,我認為您所描述的是您的頁面不同步並且您有陳舊的數據。

您說您正在更改頁面數,然后由於訪問舊頁面集而崩潰。 這聽起來像您在更改數據后沒有調用pageAdapter.notifyDataSetChanged()

當您的viewPager顯示一組 10 頁中的第 3 頁,而您更改為只有 5 頁的一組時,然后調用notifyDataSetChanged() ,您會發現您現在正在查看新組的第 3 頁。 如果您之前正在查看舊集的第 8 頁,在放入新集並調用notifyDataSetChanged()您會發現您現在正在查看新集的最后一頁而不會崩潰。

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

要切換到另一個頁面,請嘗試使用以下代碼:

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

補充答案

我最初無法從其他類方法獲取對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);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM