天天看點

Android FragmentStatePagerAdapter.notifyDataSetChanged()重新整理資料的問題

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:18px;">在使用FragmentStatePagerAdapter時,調用其notifyDataSetChanged()方法想讓Fragment重新加載,讓内部的資料重新整理。但是調用後,發現根本沒有任何作用,特别郁悶,看了百度上的一篇文章,感覺還不錯,由此得來啟發。http://blog.csdn.net/u012296101/article/details/46411515</span></span>           

我要實作這麼一個效果:在主界面上做分頁顯示資料,通過左右滑動來控制上一頁或者下一頁。主界面上有一個設定按鈕,進入後可以對資料進行更改,當我更改資料再傳回主界面的時候,上面的資料應該有重新整理。

思路:

1,頁數可能無限多,是以應該選用FragmentStatePagerAdapter而不是FragmentPagerAdapter

2,在傳回到Activity時觸發onRestart()方法,在這個時候我應該判斷資料是否有發生改變,如果改變了我就notifyDataSetChanged()更新,讓Fragment重新加載擷取資料

正常調用notifyDataSetChanged()方法界面是不會更新的,研究發現,想讓該方法有效,比較簡單的做法就是重寫getItemPosition()方法,代碼如下:

<span style="font-size:18px;">		/**
		 * 在調用notifyDataSetChanged()方法後,随之會觸發該方法,根據該方法傳回的值來确定是否更新
		 * object對象為Fragment,具體是目前顯示的Fragment和它的前一個以及後一個
		 */
		@Override
		public int getItemPosition(Object object) {
			return POSITION_NONE;	// 傳回發生改變,讓系統重新加載
			// 系統預設傳回的是 	POSITION_UNCHANGED,未改變
			// return super.getItemPosition(object);
		}</span>           

将它的傳回值改為POSITION_NONE就好了(預設傳回的是POSITION_UNCHANGED,詳見上面的連結),那麼調用notifyDataSetChanged()方法時,就會每次都去加載新的Fragment,而不是引用之前的。

源碼奉上:

<span style="font-size:18px;">public class FrgTest extends FragmentActivity{

	public static int loadPosition;
	public static boolean dataChange = false;
	private ViewPager viewPager;
	private FragmentAdapter fragmentAdapter;
	
	public void initFragment(List<GroupingGroup> ropeGroupList){
		fragmentAdapter = new FragmentAdapter(getSupportFragmentManager(), ropeGroupList);
		viewPager.setAdapter(fragmentAdapter);
		// viewPager.setOnPageChangeListener(new OnPageChangeListener() {});
	}
	
	@Override
	protected void onRestart() {
		// 在從另外一個窗體傳回時,檢查資料是否有更新
		if (dataChange) {
			// 調用更新窗體
			fragmentAdapter.notifyDataSetChanged();
			dataChange = false;
		}
		super.onRestart();
	}
	
	private class FragmentAdapter extends FragmentStatePagerAdapter{

		private List<GroupingGroup> ropeGroupList;
		
		public FragmentAdapter(FragmentManager fm, List<GroupingGroup> ropeGroupList) {
			super(fm);
			this.ropeGroupList = ropeGroupList;
		}

		@Override
		public Fragment getItem(int position) {
			loadPosition = position;
			RopeGroupFragment fragment = new RopeGroupFragment();
			return fragment;
		}

		@Override
		public int getCount() {
			return this.ropeGroupList.size();
		}
		
		/**
		 * 在調用notifyDataSetChanged()方法後,随之會觸發該方法,根據該方法傳回的值來确定是否更新
		 * object對象為Fragment,具體是目前顯示的Fragment和它的前一個以及後一個
		 */
		@Override
		public int getItemPosition(Object object) {
			return POSITION_NONE;	// 傳回發生改變,讓系統重新加載
			// 系統預設傳回的是 	POSITION_UNCHANGED,未改變
			// return super.getItemPosition(object);
		}
	}
	
	private class RopeGroupFragment extends BaseFragment<MainActivity>{

		private GridView gv_rp;
		private RopeGridViewAdapter ropeAdapter;
		private int curGroupPosition;
		private List<RopePlayerBean> mData;
		
		public RopeGroupFragment() {
			// 将資料儲存到目前界面
			curGroupPosition = FrgTest.loadPosition;
		}
		
		@Override
		public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
			View view = inflater.inflate(R.layout.fragment_rope_group, null);
			gv_rp = (GridView) view.findViewById(R.id.gv_rp);
			mData = ScoresDBManager.getInstance(mContext).getRopePlayerBeans(RopeAPP.getIdByGame(), curGroupPosition);
			ropeAdapter = new RopeGridViewAdapter(mContext, mData);
			gv_rp.setAdapter(ropeAdapter);
			return view;
		}
	}
}</span>