ViewPger在调用notifyDataSetChanged()时,会循环调用PagerAdapter中的getItemPosition()方法,遍历每一个pager。
我们在instantiateItem()中通过setTag()的方式,记住每个pager页。在getItemPosition()中,获取object的getTag(),如果要换的页面的下标等于这个tag,返回POSITION_NONE;否则,返回 POSITION_UNCHANGED。
这个方法返回 POSITION_NONE; ,表示这个页换了,会调用destroyItem()方法删除,再调用instantiateItem()方法,创建。
返回 POSITION_UNCHANGED,表示没换,什么也不做。
private List<View> mViewCache = new ArrayList<View>();
private ViewPager viewPager;
private int curUpdatePager;
// 适配器
class MyPagerAdapter extends PagerAdapter {
public void destroyItem(View arg0, int arg1, Object arg2) {
View view = (View)arg2;
((ViewPager) arg0).removeView((View)arg2);
}
public void finishUpdate(View arg0) {
}
public int getCount() {
return mViewCache.size();
}
public Object instantiateItem(View arg0, int arg1) {
mViewCache.get(arg1).setTag(arg1);
((ViewPager) arg0).addView(mViewCache.get(arg1));
return mViewCache.get(arg1);
}
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == (arg1);
}
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
@Override
public int getItemPosition(Object object) {
View view = (View)object;
if(curUpdatePager == (Integer)view.getTag()){
return POSITION_NONE;
}else{
return POSITION_UNCHANGED;
}
// return super.getItemPosition(object);
}
}
/**
* 更换pager的方法
* @param view 新的pager
* @param index 第几页
*
* 示例:updateViewPagerItem(fragment2_parentctrl_changepwd,1);
*/
private void updateViewPagerItem(View view,int index){
curUpdatePager = index;
mViewCache.remove(index);
mViewCache.add(index, view);
viewPager.getAdapter().notifyDataSetChanged();
// findViewById(getResources().getIdentifier("sysset_button"+(index+1), "id", "com.jzbyapp.suzhou")).requestFocus();
}