如何将每个viewpager页面位置存储在它们的列表中?

时间:2015-11-18 19:08:42

标签: android android-viewpager android-recyclerview

我在RecyclerView中有一个带有 UnderlinePageIndicator 的浏览器列表,在一个片段中大约有30个。我希望将每个寻呼机的页面位置存储在对象mFlat中,并在每个寻呼机更新的帮助下从mFlat中恢复它

flatViewHolder.pager.setCurrentItem(mFlat.get(RecyclerViewPosition).getCur_pos());

因此,当我尝试保存第一个寻呼机的当前页面时,它是可以的。但滚动页面后,每个寻呼机似乎都得到这个页码 - 这是错误的。我想存储每个寻呼机的页码。这是我的viewpager addOnPageChangeListener

flatViewHolder.pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int pos, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int pos) {
                // save current page pos in mFlat object
                mFlat.get(position).setCur_pos(pos);
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });

当我滚动页面时,每次都会在不同的浏览器上触发

@Override
                public void onPageSelected(int pos) {
                    // save current page pos in mFlat object
                    mFlat.get(position).setCur_pos(pos);
                }

2 个答案:

答案 0 :(得分:3)

我认为问题在于您正在调用addOnPageChangeListener

viewHolder.pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {[...]}

由于保留了对寻呼机的引用,因此每次滚动时都会添加新的侦听器。触发该侦听器时,您的position变量将在与寻呼机引用关联的所有侦听器中使用。

因此,我认为快速而肮脏的解决方案是使用setOnPageChangeListener此方法已弃用,但尚未从API中删除。调用set而不是add会将当前与寻呼机关联的侦听器替换为新的侦听器。因此,只会调用一个监听器。

试试吧。我认为它会让你到达你需要去的地方。

答案 1 :(得分:2)

你也需要在onPageScrolled中进行引用,添加:

   @Override
   public void onPageScrolled(int pos, float positionOffset, int positionOffsetPixels) {

         // Update reference for page scroll too
         mFlat.get(position).setCur_pos(pos);
    }

当您滚动页面时,它永远不会更新,只有当您选择要更新的页面时,如上所示。