<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>