151

我在我的应用程序中使用 ViewPager 并在主 Activity 中定义它。在onCreate方法内部,我从 SharedPreferences 加载了一些页面,然后将其传递给 PagerAdapter:

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

问题是,如果我将 Preferences(或另一个 Activity)中的这个数字更改为之前查看过的其他页面索引,我的应用程序会崩溃,因为当我使用这个 ViewPager 返回到 Activity 时,这个索引超出了范围。只需更改活动 ViewPager 的页面即可解决此问题。有什么办法吗?

4

5 回答 5

397

我不确定我是否完全理解这个问题,但从你的问题的标题来看,我猜你正在寻找的是pager.setCurrentItem( num ). 这允许您以编程方式切换到ViewPager.

如果这不是问题,我需要查看来自 logcat 的堆栈跟踪以更具体。

于 2011-09-16T14:40:44.157 回答
26

向右滑动

viewPager.arrowScroll(View.FOCUS_RIGHT);

向左滑动

viewPager.arrowScroll(View.FOCUS_LEFT);

于 2017-03-06T02:26:18.973 回答
19

如果不检查您的代码,我认为您所描述的是您的页面不同步并且您的数据过时。

您说您正在更改页数,然后因为您正在访问旧的页面集而崩溃。在我看来,这听起来像是您pageAdapter.notifyDataSetChanged()在更改数据后没有打电话。

当您viewPager正在显示一组 10 页的第 3 页,而您更改为只有 5 页的一组时,然后调用notifyDataSetChanged(),您会发现您现在正在查看新组的第 3 页。如果您之前查看的是旧集的第 8 页,则在放入新集并调用后,notifyDataSetChanged()您会发现您现在正在查看新集的最后一页而不会崩溃。

如果您只是更改当前页面,您可能只是在掩盖问题。

于 2014-01-26T23:15:47.537 回答
18

要切换到另一个页面,请尝试使用以下代码:

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);
于 2016-09-15T21:05:55.110 回答
3

补充答案

我最初无法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);
    }

}
于 2016-12-05T05:16:45.780 回答