最基本的方法:
針對(duì)于child view比較簡單的情況(例如僅有TextView、ImageView等,沒有ListView等展示數(shù)據(jù)的情況)析桥,可以在自己的Adapter中加入代碼:
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
這樣既可達(dá)到一般情況下要求的效果。
存在的問題:
這不是PagerAdapter中的Bug授段,通常情況下,調(diào)用 notifyDataSetChanged方法會(huì)讓ViewPager通過Adapter的getItemPosition方法查詢一遍所有child view番甩,這種情況下侵贵,所有child view位置均為POSITION_NONE,表示所有的child view都不存在缘薛,ViewPager會(huì)調(diào)用destroyItem方法銷毀窍育,并且重新生成,加大系統(tǒng)開銷掩宜,并在一些復(fù)雜情況下導(dǎo)致邏輯問題蔫骂。特別是對(duì)于 只是希望更新child view內(nèi)容的時(shí)候,造成了完全不必要的開銷牺汤。
更有效地方法:
ViewPger在調(diào)用notifyDataSetChanged()時(shí)辽旋,會(huì)循環(huán)調(diào)用PagerAdapter中的getItemPosition()方法,遍歷每一個(gè)pager。
我們?cè)趇nstantiateItem()中通過setTag()的方式补胚,記住每個(gè)pager頁码耐。在getItemPosition()中,獲取object的getTag(),如果要換的頁面的下標(biāo)等于這個(gè)tag溶其,返回POSITION_NONE骚腥;否則,返回 POSITION_UNCHANGED瓶逃。
這個(gè)方法返回 POSITION_NONE; 束铭,表示這個(gè)頁換了,會(huì)調(diào)用destroyItem()方法刪除厢绝,再調(diào)用instantiateItem()方法契沫,創(chuàng)建。
返回 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();
}
Fragment在FragmentStatePagerAdapter類的destroyItem方法中被remove時(shí)靶病,F(xiàn)ragment的onDestroy方法和onDetach方法都被調(diào)用到会通。
當(dāng)Fragment重新被add時(shí),F(xiàn)ragment的生命周期全部重新調(diào)用娄周,但是savedInstanceState參數(shù)保留著之前存儲(chǔ)的數(shù)據(jù)涕侈。