Answers:
我不确定我是否完全理解该问题,但是从您的问题标题来看,我猜您正在寻找的是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()
会发现现在正在查看新集的最后一页而不会崩溃。
如果仅更改当前页面,则可能只是掩盖了问题。
notifyDataSetChanged()
要切换到另一页,请尝试以下代码:
viewPager.postDelayed(new Runnable()
{
@Override
public void run()
{
viewPager.setCurrentItem(num, true);
}
}, 100);
viewPager.setCurrentItem
补充答案
我最初在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);
}
}
0
inonPause
方法,没有崩溃。谢谢。