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>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值