如何更改 ViewPager 的页面?

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

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

问题在于,如果我将 Preferences (或另一个 Activity)中的这个数字更改为之前查看的页面索引,我的应用程序就会崩溃,因为当我使用这个 ViewPager 返回到活动时,这个索引是出界的。只需更改活动 ViewPager 的页面即可修复。有什么办法吗?

122513 次浏览

我不确定我是否完全理解这个问题,但是从你问题的题目来看,我猜想你要找的是 pager.setCurrentItem( num )。这允许您以编程方式切换到 ViewPager中的另一个页面。

如果这不是问题所在,我需要看到 logcat 的堆栈跟踪,以便更具体地说明。

在不检查代码的情况下,我认为您描述的是页面不同步,并且数据过时。

您说您正在更改页面的数量,然后由于访问旧的页面集而崩溃。这听起来像你没有调用 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);
}


}

滑到右边

ArrowScroll (View.FOCUS _ Right) ;

向左滑动

ArrowScroll (View.FOCUS _ LEFT) ;