Android学习笔记——关于Android ViewPager 在 adapter.notifyDataSetChanged 后 setCurrentItem 方法失效的解决办法

原创 2015年11月18日 23:45:27

   今天遇到了一个项目上的bug,就是在使用 ViewPager 连接 多个 Fragment 做切换时,ViewPager 的 setCurrentItem方法 只在首次显示Fragment 生效而往后失效这么一个问题;举个复现例子,就是若我首次启动这个Fragment,滑动ViewPager 使 CurrentItem的位置为3;然后关掉 Fragment,再启动,那么该次启动的Fragment 的首个pager 位置会是上次的结束位置3,而不是我们期待的0,即使我在每次Fragment createView的时候都 setCurrentItem(0)了;

  研究了好一阵,造成这个问题的原因应该是Fragment的每次创建 用了 newInstance (为了保证不内存溢出);后来Google找到了该问题的解决办法: 

 Last thing, when you change your dataset you need to call the "notifyDataSetChanged" method that I mentioned above, and then you call the "setCurrentItem" method inside a handler. If you don't, your app will not work as expected.

ViewPager mPager = new ViewPager();
mPager.getAdapter().notifyDataSetChanged();  //This notify that you need to recreate the views

/*This is if you want to change the data and then go to a specific position
If you do not do this you will have a very Buggy Behavior*/
new Handler().post(new Runnable() {
@Override
public void run() {
    mPager.setCurrentItem(2); //Where "2" is the position you want to go
    }
});
  对, 因为数据会重新init ,所以办法 就是一定记得在调用 ViewPager 关联的 Adapter 的 notifyDataSetChanged()方法后,在 handler里面再调用ViewPager 的 setCurrentItem方法,就OK啦. 我也是个android新人,所以为啥这样改的具体原因也还不是很明白就不乱说啦~

  看中文博客很少有关于这个问题的解答,所以写一篇;如需要更详细的解释 请转到这个链接研究啦:

   http://stackoverflow.com/questions/12008716/setcurrentitem-in-viewpager-not-scroll-immediately-in-the-correct-position




   

版权声明:本文为博主原创文章,未经博主允许不得转载。

ViewPager的setAdapter和setCurrentItem的方法解析

ViewPager
  • liumeng123321
  • liumeng123321
  • 2016年09月22日 18:49
  • 7709

ViewPager 的adapter 设置notifyDataSetChanged(),后 ViewPager.setCurrentItem()无效。(页面不滚动)

把ViewPager.setCurrentItem()   用Handler  去处理。原因待深究
  • qyc2072047092
  • qyc2072047092
  • 2017年06月15日 13:42
  • 452

ViewPager中setCurrentItem()失效分析

1、给ViewPager设置进入哪个Fragment页面时setCurrentItem()未起作用,原因是 该方法需要在绑定了adapter并设置了indicator后使用 2、Vie...
  • Pillar1066527881
  • Pillar1066527881
  • 2017年01月16日 13:40
  • 1959

setCurrentItem 作用

转载:http://blog.csdn.net/ms03001620/article/details/8362704 setCurrentItem(int index)方法主要用来制定初始化...
  • u013125680
  • u013125680
  • 2015年05月26日 14:02
  • 9402

Android面试题-终极解决ViewPager.setCurrentItem中间很多页面切换方案

一劳永逸解决ViewPager.setCurrentItem切换页面方案
  • mwq384807683
  • mwq384807683
  • 2017年05月10日 17:25
  • 2968

Android之 修改ViewPager调用setCurrentItem时,滑屏的速度

1。前言:在使用ViewPager的过程中,有需要直接跳转到某一个页面的情况,这个时候就需要用到ViewPager的setCurrentItem方法了,它的意思是跳转到ViewPager的指定页面,但...
  • jky_yihuangxing
  • jky_yihuangxing
  • 2016年09月19日 12:50
  • 1506

无限轮播图填坑--ViewPager 调用setCurrentItem(int position) 卡死

项目需求有无限轮播图,之前一直用的没问题,就用之前的放上去了,但是,有个需求是刷新时,把轮播图位置复位,心想不就是setCurrentItem么,so easy! 但....事情却没有那么简单 大...
  • sandyisbusy
  • sandyisbusy
  • 2016年12月21日 22:21
  • 1838

修改ViewPager调用setCurrentItem时,滑屏的速度

修改ViewPager调用setCurrentItem时,滑屏的速度。
  • zmywly
  • zmywly
  • 2013年10月17日 18:46
  • 17795

从setCurrentItem(int item)探索ViewPager

前言:    对于开博第一篇,花点时间写个前言,哈哈~ 先记录下我的初心: 1,作为一个android从业者,发现有价值的开源分享,会有莫名的欣喜,我也跟随大神们的脚步,希望给世界输出点点滴~ 2,a...
  • sinat_22643969
  • sinat_22643969
  • 2016年08月19日 13:50
  • 469

ViewPager setCurrentItem 设置滑动速度

例如,当我们用一个按钮来控制ViewPagmViewPager.setCurrentItem(++currPositon);
  • yersterday
  • yersterday
  • 2014年07月24日 10:39
  • 1256
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android学习笔记——关于Android ViewPager 在 adapter.notifyDataSetChanged 后 setCurrentItem 方法失效的解决办法
举报原因:
原因补充:

(最多只允许输入30个字)