我在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);
}
答案 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);
}
当您滚动页面时,它永远不会更新,只有当您选择要更新的页面时,如上所示。