今天Android的同事妹子在做无限循环Banner图的时候遇到一个问题,就是设置好数据啊什么的运行的时候界面卡死,显示ANR异常,后来发现是她把ViewPager的初始位置setCurrentItem(Integer.MAX_VALUE / 2)导致的,后来想为什么设置的数值大了会发生ANR异常。看了下源码:
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);
}
为了能够实现ViewPager的近似无限轮播效果,同事将viewPager的限制页数设置为Integer类型的最大值的一半,但也从而会使ViewPager在setCurrentItem时测量页数太大,绘制UI频繁而阻塞主线程ANR,因此我将数量改成了相对较小些问题便得带了根本的解决。
其实我去年写过另外一种方法实现无限循环的Banner,逻辑麻烦一点,不过真的挺有意思的:
http://blog.youkuaiyun.com/Just_Sanpark/article/details/17436037