在开发项目中的时候大多我们为了方便就会使用第三方的控件,而在开发的时候相信大家对fragmen的遇到的坑不少吧,今天就为大家讲解viewpager+fragment+tablayout如何动态的更新数据:
而在此处我提供两种方法供大家参考:
1:暴力刷新:你要动态刷新数据,在FragmentPagerAdapter中必须实现此方法,并且只能在这个方法里,不能是getItem。否则调用notifyDataSetChanged就没有效果,
if (pagerAdapter == null) {
pagerAdapter = new NoScrollViewPagerAdapter(getChildFragmentManager());//继承FragmentPagerAdapter
}
mViewpager.setAdapter(pagerAdapter);
mViewpager.setOffscreenPageLimit(1);
tab.setViewPager(mViewpager);
if (isRefresh) {//是否强制刷新,此处做判断
pagerAdapter.setNewFragments();//这是我在FragmentPagerAdapter中定义的刷新方法,
}
private class NoScrollViewPagerAdapter extends FragmentPagerAdapter {
private List<String> tags;//标示fragment的tag
private FragmentManager fragmentManager;
NoScrollViewPagerAdapter(FragmentManager fm) {
super(fm);
this.tags = new ArrayList<>();
this.fragmentManager = fm;
}
//Fragment的实例化工作
@Override
public Fragment getItem(int position) {
return SortFragment.getInstance(categoryList.get(position).getDictSn(), Fragment.GRABORDER);
}
@Override
public int getCount() {
return categoryList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return categoryList.get(position).getName();
}
//返回PagerAdapter.POSITION_NONE保证调用notifyDataSetChanged刷新Fragment。
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;//必须返回的是POSITION_NONE,否则不会刷新
}
//这个就不说了
private String makeFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
//必须重写此方法,添加tag一一做记录
@Override
public Object instantiateItem(ViewGroup container, int position) {
tags.add(makeFragmentName(container.getId(), getItemId(position)));
Fragment fragment = (Fragment) super.instantiateItem(container, position);
this.fragmentManager.beginTransaction().show(fragment).commit();
return fragment;
}
//根据tag查找缓存的fragment,移除缓存的fragment,替换成新的
public void setNewFragments() {
if (this.tags != null) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
for (int i = 0; i < tags.size(); i++) {
fragmentTransaction.remove(fragmentManager.findFragmentByTag(tags.get(i)));
}
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
tags.clear();
}
notifyDataSetChanged();
}
}
//Fragment的实例化工作
@Override
public Fragment getItem(int position) {
return SortFragment.getInstance(categoryList.get(position).getDictSn(), Fragment.GRABORDER);
}
@Override
public int getCount() {
return categoryList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return categoryList.get(position).getName();
}
//返回PagerAdapter.POSITION_NONE保证调用notifyDataSetChanged刷新Fragment。
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;//必须返回的是POSITION_NONE,否则不会刷新
}
//这个就不说了
private String makeFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
//必须重写此方法,添加tag一一做记录
@Override
public Object instantiateItem(ViewGroup container, int position) {
tags.add(makeFragmentName(container.getId(), getItemId(position)));
Fragment fragment = (Fragment) super.instantiateItem(container, position);
this.fragmentManager.beginTransaction().show(fragment).commit();
return fragment;
}
//根据tag查找缓存的fragment,移除缓存的fragment,替换成新的
public void setNewFragments() {
if (this.tags != null) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
for (int i = 0; i < tags.size(); i++) {
fragmentTransaction.remove(fragmentManager.findFragmentByTag(tags.get(i)));
}
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
tags.clear();
}
notifyDataSetChanged();
}
}
其中SortFragment是fragment的复用
2: 最笨的方法你可以在生命周期中做判断,哈哈,一般不会这样做的,除非你实在是没有办法了
注释已经十分详细了,如果还有什么不懂得欢迎留言,一起探讨。
博客虽短,十分精华,欢迎留言! 》-《