解决viewpager+fragment+tablayout的动态刷新

在开发项目中的时候大多我们为了方便就会使用第三方的控件,而在开发的时候相信大家对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: 最笨的方法你可以在生命周期中做判断,哈哈,一般不会这样做的,除非你实在是没有办法了

注释已经十分详细了,如果还有什么不懂得欢迎留言,一起探讨。

博客虽短,十分精华,欢迎留言! 》-《

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值