【问题标题】:Android ViewPager and FragmentStatePagerAdapter - not started on first itemAndroid ViewPager 和 FragmentStatePagerAdapter - 未在第一项上启动
【发布时间】:2016-12-01 18:26:20
【问题描述】:

我有一个包含项目列表的视图。当我单击特定列表项时,它会在新活动(和新片段)中显示该特定对象的详细信息。这一切都很好。

现在我想添加一个功能,用户可以从选定的详细活动显示项目滑动到下一个/上一个项目,因此他不必返回列表并选择另一个项目。我尝试使用 ViewPager 和 FragmentStatePagerAdapter,它确实有效并且效果非常好。

我的 Activity.java:

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

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

    ...
    }

   private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
        // pos is the position of the object in the list    
            Fragment fragment = ExerciseFragment.newInstance(exercisesArray, pos+position);
            return fragment;
        }

        @Override
        public int getCount() {
            return exercisesArray.size();
        }
    }

我的问题:

  1. ViewPager 是否适合我的意图?每当用户滑动到下一个项目时,都会实例化一个新片段。该列表可以包含大约 100 个项目......所以可能创建了 100 个片段?这会是个问题吗?

  2. 只有当第一个项目被选中并滑动时,我的实现才能正常工作。例如:我在一个列表中有 5 个项目,并且单击了第一个项目。现在我可以滑动到第二个项目,第三个项目,回到第二个。但是,如果用户单击列表的第三项,我无法向左滑动到第二项和第一项!有人有想法吗?

非常感谢!

【问题讨论】:

  • 请提供代码 sn-ps,以便更容易理解和识别您的实施中的潜在问题。
  • 我添加了一些我的详细活动的代码。我的问题是, pagerAdapter 被称为单击和下一个项目(并在滑动时为下一个和下一个......)。我无法滑动到点击之前的项目。
  • 关于第一个问题,您可以预先限制为您实例化的片段数量,例如如果您设置限制为 5,则将实例化 5 个片段,以及您何时会滑过第 6 个片段片段,第一个将从堆栈中删除。见this

标签: android android-viewpager


【解决方案1】:

你不需要在你的viewpager中预先加载所有的片段,为了决定你想要预先加载的片段数量的限制,使用viewPager.setOffscreenPageLimit(yourDesiredIntegerValue); 欲了解更多信息,see this n


注意:您不能将此限制设置为零,但即使您尝试设置它,viewpager 也会忽略它并将此限制设置为 1(默认)。

关于第二个问题,把你的activity保持在backstack中,当你的用户回到那个时候,正常的流程就会随之而来。就这么简单。

【讨论】:

  • 谢谢 nobalG,我要试试 setOffscreenPageLimit :-) 关于第二个问题:对不起,我是 android 新手,不明白你的答案。如果我的列表中有 5 个项目并单击第三个项目,我可以在详细视图中看到它(getItem() 以位置 0 调用),我可以向右滑动以查看第四个项目。但我无法向左滑动查看第二个项目。知道怎么做吗?
  • 通过将活动保留在后台堆栈中,我的意思是当您的用户单击 viewpager 中的项目时,启动一个新活动并在那里显示详细信息,当用户返回第一个活动时(那个使用视图寻呼机)通过按回,他将能够向任一方向移动。
  • 是否有可能支持向左滑动以显示上一个项目而不用我的列表返回活动?这就是我想做的事情
  • 我明白了... getItem() 总是从位置 0 开始,我添加了所选项目的位置。相反,我在 onCreate() 和“ExerciseFragment.newInstance(exercisesArray, position);”中使用 mPager.setCurrentItem(pos)在 getItem() 中。非常简单 - 感谢您的帮助!
猜你喜欢
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多