【问题标题】:Wrong position value in Android ViewPagerAndroid ViewPager 中的位置值错误
【发布时间】:2014-12-23 03:36:28
【问题描述】:

我正在尝试使用 ViewPager 实现由 3 个片段(或 3 个布局)组成的 3 张幻灯片,我想知道我当前显示的是哪张幻灯片以显示适当的内容。简而言之,我想要幻灯片 1 上的内容 1,幻灯片 2 上的内容 2,依此类推。

这是我的 Activity 中的实际代码(来自 android 官方文档):

public class SliderActivity extends FragmentActivity {
    private static final int NUM_PAGES = 3;
    private ViewPager mPager;
    private PagerAdapter mPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_slider);

        // Instantiate a ViewPager and a PagerAdapter.
        mPager = (ViewPager) findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);
    }

    @Override
    public void onBackPressed() {
        if (mPager.getCurrentItem() == 0) {
            // If the user is currently looking at the first step, allow the system to handle the
            // Back button. This calls finish() on this activity and pops the back stack.
            super.onBackPressed();
        } else {
            // Otherwise, select the previous step.
            mPager.setCurrentItem(mPager.getCurrentItem() - 1);
        }
    }

    // A simple pager adapter that represents 3 ScreenSlidePageFragment objects, in sequence.
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            System.out.println("POSITION = " + position); // Or mPager.getCurrentItem()
            return new SlidesFragment();
        }

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

无论我多么努力,getCurrentItem()position 仍然会打印错误的值。只有第二张幻灯片向控制台发送一个数字。向右滑动时为 2,向左滑动时为 0。

我做错了什么?

【问题讨论】:

  • 我在想幻灯片还在内存中,所以没必要再弄了。应用启动时你有什么收获吗?

标签: android slider android-viewpager fragment


【解决方案1】:

您肯定要使用getItem 中的位置值,不要调用getCurrentItem,因为寻呼机将创建不是当前项目且不在屏幕上的项目。默认情况下,寻呼机的屏幕外页面限制为 2。因此,当它第一次创建时,getItem 将被调用,位置为 0,然后立即再次调用位置 1。位置 1 的片段不是当前项目,但它是在屏幕外创建的,因此用户可以开始滑过去看看。然后当你完成滑动时,getItem 被调用,位置为 2 以预加载下一张也是最后一张幻灯片。

要完成“我想要幻灯片 1 上的内容 1,幻灯片 2 上的内容 2”,您的 SlidesFragment 需要接受一个参数(存储在参数包中)告诉它要显示哪些内容的位置。或者,更有可能的是,您将根据位置创建 3 种不同的片段类型。

【讨论】:

  • 好的,所以我不能真正信任记录的position 值。但是,当我直接指定与position 相关的3 个片段时,它会起作用
  • 好的,我找到了这个答案,我觉得它很有趣,你能扩大讨论并用一些例子解释更多吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2016-11-18
相关资源
最近更新 更多