关于PagerAdapter的instantiateItem方法

   之前以为ViewPager每次滑动都会调用instantiateItem,后来做项目时发现有时滑动时并不执行写在instantiateItem中的一些更新操作。于是写了个demo测试一下,代码如下:

public class MainActivity extends Activity {
	ViewPager pager;
	List views;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		pager = (ViewPager)findViewById(R.id.view_pager);
		views = new ArrayList();
		
		LayoutInflater mLi = LayoutInflater.from(this);  
		View view1 = mLi.inflate(R.layout.view1, null);  
		View view2 = mLi.inflate(R.layout.view2, null);  
		View view3 = mLi.inflate(R.layout.view3, null);  
		views.add(view3);  
		views.add(view2);   
		views.add(view1);
		
		MyPagerAdapter adapter = new MyPagerAdapter();
		pager.setAdapter(adapter);
	}
	
	
	class MyPagerAdapter extends PagerAdapter{

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return views.size();
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			// TODO Auto-generated method stub
			return arg0 == arg1;    //这行代码很重要,它用于判断你当前要显示的页面
		}
		
		@Override  
		public Object instantiateItem(ViewGroup container, int position) {  
		    container.addView(views.get(position));  
		    Log.d("tag",String.valueOf(position));
		    return views.get(position);  
		}  
		@Override  
		public void destroyItem(ViewGroup container, int position, Object object) {  
		    container.removeView(views.get(position));  
		}  
		

		
	}
}

运行时,当我进入第一页时,log打印 0和1,当我滑到第二页时,log打印2,当我滑到第三页时,log没有输出信息。

所以我觉得是这样的。因为pagerAdapter是默认预加载前后一张的,所以当加载第一页时。调用了两次instantiateItem方法,第一次是加载本来的第一页,第二次是预加载第二页,所以log打印了0和1。可是显示的本来加载的第一页。当滑动到第二页时,只调用了一次instantiateItem方法,是因为本页已经在之前预加载过了,没有再调用instantiateItem方法也就是log不会再打印1,而是直接从ViewGroup中直接取出第二页用于显示。然后进行预加载第三页,所以这里会调用instantiateItem方法并打印2.接着滑动到第三页,由于第三节页也已经预加载过了,所以只是从ViewGroup取出第三页显示而不调用instantiateItem。但是由于预加载默认是前后一张,所以这时会从ViewGroup中取出第一页销毁。直到从第三页滑到第二页时才会再预加载第一页。

ViewGroup

你可能感兴趣的:(Android)