【问题标题】:How to change ViewPager's page?如何更改 ViewPager 的页面?
【发布时间】:2011-09-15 00:25:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这正是我所需要的。我在onPause 方法中将它设置为0 并且没有崩溃。谢谢。
    • ViewPager 上的文档确实非常少。为此 +1。
    • 如果您的寻呼机加载页面的时间比您可以使用 setOffscreenPageLimit(1) 的时间长,因为默认情况下查看寻呼机从当前位置加载 +1 和 -1 页面
    • 这不起作用我只是收到一条错误消息,指出已添加片段。
    【解决方案2】:

    向右滑动

    viewPager.arrowScroll(View.FOCUS_RIGHT);

    向左滑动

    viewPager.arrowScroll(View.FOCUS_LEFT);

    【讨论】:

    • 简洁干净!
    • 我几乎相信这应该是公认的答案。比设置当前项实用得多。
    【解决方案3】:

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

    您说您正在更改页数,然后由于您正在访问旧的页面集而崩溃。这听起来像是您在更改数据后没有调用pageAdapter.notifyDataSetChanged()

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

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

    【讨论】:

    • notifyDataSetChanged() 加 1
    • @Richard 你救了我的一天,伙计。 notifyDataSetChanged() 10000+
    【解决方案4】:

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

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

    【讨论】:

    • 完美!我尝试在没有 postDelay 方法的情况下使用它,但它不起作用。你知道为什么它适用于这种方法吗?谢谢! :)
    • 同样的问题......为什么项目会随着这个延迟而改变,而不是其他情况?
    • @GeorgiKoemdzhiev 因为调用viewPager.setCurrentItem时视图还没有完成@
    【解决方案5】:

    补充答案

    我最初无法从其他类方法中获取对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);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多