在使用FragmentStatePagerAdapter时,调用其notifyDataSetChanged()方法想让Fragment重新加载,让内部的数据刷新。但是调用后,发现根本没有任何作用,特别郁闷,看了百度上的一篇文章,感觉还不错,由此得来启发。http://blog.csdn.net/u012296101/article/details/46411515
我要实现这么一个效果:在主界面上做分页显示数据,通过左右滑动来控制上一页或者下一页。主界面上有一个设置按钮,进入后可以对数据进行更改,当我更改数据再返回主界面的时候,上面的数据应该有刷新。
思路:
1,页数可能无限多,所以应该选用FragmentStatePagerAdapter而不是FragmentPagerAdapter
2,在返回到Activity时触发onRestart()方法,在这个时候我应该判断数据是否有发生改变,如果改变了我就notifyDataSetChanged()更新,让Fragment重新加载获取数据
正常调用notifyDataSetChanged()方法界面是不会更新的,研究发现,想让该方法有效,比较简单的做法就是重写getItemPosition()方法,代码如下:
/**
* 在调用notifyDataSetChanged()方法后,随之会触发该方法,根据该方法返回的值来确定是否更新
* object对象为Fragment,具体是当前显示的Fragment和它的前一个以及后一个
*/
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;// 返回发生改变,让系统重新加载
// 系统默认返回的是 POSITION_UNCHANGED,未改变
// return super.getItemPosition(object);
}
将它的返回值改为POSITION_NONE就好了(默认返回的是POSITION_UNCHANGED,详见上面的链接),那么调用notifyDataSetChanged()方法时,就会每次都去加载新的Fragment,而不是引用之前的。
源码奉上:
public class FrgTest extends FragmentActivity{
public static int loadPosition;
public static boolean dataChange = false;
private ViewPager viewPager;
private FragmentAdapter fragmentAdapter;
public void initFragment(List 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 ropeGroupList;
public FragmentAdapter(FragmentManager fm, List 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{
private GridView gv_rp;
private RopeGridViewAdapter ropeAdapter;
private int curGroupPosition;
private List 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;
}
}
}