天天看點

解決Android下ViewPager和PagerAdapter中調用notifyDataSetChanged失效問題

Google在Android 3.0SDK中推出的ViewPager控件很大程度上滿足了開發者開發頁面左右移動切換的功能,使用非常友善,參見:http://jameszhao84.iteye.com/blog/1344584。但是使用中發現,在删除或者修改資料的時候,PagerAdapter無法像BaseAdapter那樣僅通過notifyDataSetChanged方法通知重新整理View。

最基本的方法:

針對于child view比較簡單的情況(例如僅有TextView、ImageView等,沒有ListView等展示資料的情況),可以在自己的Adapter中加入代碼:

@Override
	public int getItemPosition(Object object) {
		return POSITION_NONE;
	}
           

這樣既可達到一般情況下要求的效果。

存在的問題:

這不是PagerAdapter中的Bug,通常情況下,調用notifyDataSetChanged方法會讓ViewPager通過Adapter的getItemPosition方法查詢一遍所有child view,這種情況下,所有child view位置均為POSITION_NONE,表示所有的child view都不存在,ViewPager會調用destroyItem方法銷毀,并且重新生成,加大系統開銷,并在一些複雜情況下導緻邏輯問題。特别是對于隻是希望更新child view内容的時候,造成了完全不必要的開銷。

更有效地方法:

更為靠譜的方法是因地制宜,根據自己的需求來實作notifyDataSetChanged的功能,比如,在僅需要對某個View内容進行更新時,在instantiateItem()時,用View.setTag方法加入标志,在需要更新資訊時,通過findViewWithTag的方法找到對應的View進行更新即可。