關於PagerAdapter的instantiateItem方法

之前以爲ViewPager每次滑動都會調用instantiateItem,後來做項目時發現有時滑動時並不執行寫在instantiateItem中的一些更新操作。於是寫了個demo測試一下,代碼如下:

public class MainActivity extends Activity { ViewPager pager; List<View> 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<View>(); 

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中取出第一頁銷燬。直到從第三頁滑到第二頁時纔會再預加載第一頁。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章