无限轮播图填坑--ViewPager 调用setCurrentItem(int position) 卡死
2016-12-21 22:21
489 查看
项目需求有无限轮播图,之前一直用的没问题,就用之前的放上去了,但是,有个需求是刷新时,把轮播图位置复位,心想不就是setCurrentItem么,so easy!
但....事情却没有那么简单
大家都知道,无限轮播图的做法就是把Adapter中重写getCount返回一个很大的数字,欺骗viewpager有很多,在对position和数据size取模,使数据的position和实际的position对应上,然后使用的时候把当前position设置到getCount数值 的中间,所以setAdapter后setCurrentItem(...),ok,到这里一切顺利
当页面刷新时,得到新数据,对viewpager重新设置数据,然后再次setCurrentItem恢复到初始位置时,问题就来了,这时整个页面完全卡死,过一会就ANR了
懵了......
这么简单的问题竟然会有问题
好了,开始解决问题
经过调试,问题代码就出现在setCurrentItem这行代码,查看ViewPager源码,发现最终调用到这个方法:
void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {}方法里面有行判断:
if (mFirstLayout) { // We don't have any idea how big we are yet and shouldn't have any pages either. // Just set things up and let the pending layout handle things. mCurItem = item; if (dispatchSelected) { dispatchOnPageSelected(item); } requestLayout(); } else { populate(item); scrollToItem(item, smoothScroll, velocity, dispatchSelected); }
mFirstLayout是一个私有变量,默认为true,第一次设置数据时,mFirstLayout为true,然后在viewpager的
onLayout方法中就被设置成了false
当下次再次setCurrentItem时就进入了else中,这时,else中的代码就会引起UI卡顿,具体原因还未深入研究
但到这就有了思路了,可以利用反射,强行修改mFirstLayout的值为true
try {Field mFirstLayout = ViewPager.class.getDeclaredField("mFirstLayout");mFirstLayout.setAccessible(true);mFirstLayout.set(vp_top, true);myPagerAdapter.notifyDataSetChanged();vp_top.setCurrentItem(Integer.MAX_VALUE/4-( Integer.MAX_VALUE/4 % ids_list_data.size() ));}catch(Exception e) {e.printStackTrace();}
好了,到这里问题解决
ps 中间考虑过的方法还有一种,就是获取当前position,经过判断需要位移多受啊能到初始位置,就在刷新时偏移多少,但
是经测试,发现一个问题,在
vp_top.setCurrentItem(vp_top.getCurrentItem()+1);这样偏移一个单位时是没问题的,但是大于1就会卡顿,这个原因
不是很清楚,可能还是跟view的实例化有关,还需要深入研究
相关文章推荐
- ViewPager调用setCurrentItem(position)时,跳转Fragment 问题
- Viewpage的.setCurrentItem 导致UI线程的执行阻塞问题 广告轮播 数据加载后填充viewpagerAdapter
- 修改ViewPager调用setCurrentItem时,滑屏的速度
- ViewPager调用SetCurrentItem()方法,跨页面跳转时闪屏的问题
- Android之 修改ViewPager调用setCurrentItem时,滑屏的速度
- 修改ViewPager调用setCurrentItem时,滑屏的速度
- 批改ViewPager调用setCurrentItem时,滑屏的速度
- android 只修改ViewPager调用setCurrentItem时,滑屏的速度,其他正常
- viewPager 调用setCurrentItem()无效
- android 只修改ViewPager调用setCurrentItem时,滑屏的速度,其他正常
- 在onTabSelected里面调用viewPager.setCurrentItem方法发生java.lang.NullPointerException错误
- 修改ViewPager调用setCurrentItem时,滑屏的速度 ,解决滑动之间切换动画难看
- 修改ViewPager调用setCurrentItem时,滑屏的速度
- 修改ViewPager调用setCurrentItem时,滑屏的速度 ,解决滑动之间切换动画难看
- 怎么设置viewpager在使用setCurrentItem的滑动速度
- 从setCurrentItem(int item)探索ViewPager
- 解决ViewPager setCurrentItem 时闪太快
- ViewPager setCurrentItem(0)时,OnPageChangeListener onPageSelected() 不响应
- viewpager setCurrentItem 过多出现卡顿 ANR 线程阻塞 页面无响应
- ViewPager.setCurrentItem(0)报错