Maison > Questions et réponses > le corps du texte
现在是这种情况,我的ViewPager
使用FragmentPagerAdapter
作为Adapter
,在adapter
中的getItem
中返回一个新的Fragment
,fragment
显示的数据是从网上拿下来的,但是这个数据我需要刷新,刷新之后显示也要跟着刷新才对。现在问题就来了,这种模式下应该如何刷新fragment
中的数据呢?
下面是我设置ViewPager
的代码和FragmentPagerAdapter
的代码,里面的数据仅仅是个模拟,但真实情况类似:
int[] arg1 = new int[]{1,2,3,4,5,6,7};
int[] arg2 = new int[]{11,22,33,44,55,66,77,88,99};
final FragmentPager adapter = new FragmentPager(getSupportFragmentManager());
adapter.setData(arg1);
viewPager.setAdapter(adapter);
viewPager.setPageTransformer(true, new Transformer());
private class FragmentPager extends FragmentPagerAdapter {
private int[] data;
public FragmentPager(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return BlankFragment.newInstance(data[position] +"");
}
@Override
public int getCount() {
return data.length;
}
public void setData(int[] arg) {
data = arg;
}
}
下面是我的Fragment的代码(这个是根据Android Studio的模板生成的):
public class BlankFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private String mParam1;
public BlankFragment() {
}
public static BlankFragment newInstance(String param1 ) {
BlankFragment fragment = new BlankFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_blank, container, false);
((TextView)view.findViewById(R.id.fragment_center_text)).setText(mParam1);
return view;
}
}
现在,假如说数据改变了,在这个例子中就是adapter
的setData
传入的数据改变了,我应该怎么属性Fragment
的数据呢?
我查过很多解决方法,但是POSITION_NONE
和notifyDataSetChanged()
在这里并不能发挥作用,而且我也不希望这么做,原因在这个问题里:https://segmentfault.com/q/1010000004572993
天蓬老师2017-04-17 16:12:41
覆写getItemPosition使其返POSITION_NONE,以触发Fragment的销毁和重建。可是这将导致Fragment频繁的销毁和重建,并不是最佳的方法。
而 getItemPosition(Object object)
入口参数 object "representing an item", 实际上就是Fragment,只需要为Fragment提供一个更新view的public方法,然后把入口参数强制转型成自定义的Fragment,调用该Fragment的update方法以完成更新。
https://github.com/li2/Update_Replace_Fragment_In_ViewPager
如何更新及替换ViewPager中 Fragment?
巴扎黑2017-04-17 16:12:41
如果Tab是有可能变化的 建议使用FragmentStatePagerAdapter,FragmentPagerAdapter被设计出来就是用于固定的Tab,当然也可以通过以下方案来支持刷新:
private int mChildCount;
@Override
public void notifyDataSetChanged() {
mChildCount = getCount();
super.notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
if (mChildCount > 0) {
mChildCount--;
return POSITION_NONE;
}
return super.getItemPosition(object);
}