ViewPager实现无限循环,左右滑动,定时轮播及内存泄漏处理
PagerAdapter 代码
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
- 关键是将viewpager的数量设置为最大
剩下的代码就简单了
`@Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager)container).removeView(list.get(position%list.size())); }
`
* 销毁的代码
`@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
View view = list.get(position%list.size());
container.addView(view,0);
return view;
}`
* 这里都是取得余数,因为我们实际对象个数,只有list.size()个
* 之后默认选中第n个就行了
` spVpager.setCurrentItem(vpList.size()*400);`
* 这样写的话,可以实现左右滑动(不要设置太大,否则回退现象很明显)
* hander中实现轮播
`public void handleMessage(android.os.Message msg) {
int position= spVpager.getCurrentItem()+1;
if(!isMove&&state==OnScrollListener.SCROLL_STATE_IDLE)
spVpager.setCurrentItem(position,true);
sendEmptyMessageDelayed(0, 5000);
};`
* 需要判断是否移动过了,和当前的pagerItem的状态(优化)
* 因为使用了Handler发送延时消息,因此会造成内存泄漏,因此需要在onDestory中移除所有的任务和消息
`handler.removeCallbacksAndMessages(null);
* 进一步对内存泄漏进行优化 否则activity销毁不了
* 内存泄漏分析
* activity想要销毁的话,其会销毁handler,handler要想销毁的话,handler中不能有任务和Message,因为发送的是延时的任务,因此handler中很有可能有任务执行,有任务执行的时候handler销毁不了,handler又持有activity的引用,因此造成一个死循环,导致activity销毁失败