美文网首页Android Studio 问题集锦
ViewPager动态替换Fragment

ViewPager动态替换Fragment

作者: 傲娇的狗蛋 | 来源:发表于2019-04-18 15:15 被阅读0次

    最近遇到一个需求,主页采用ViewPager+Fragment的主页。用户在设置中可以动态修改ViewPager的Fragment。原本以为只是动态修改数据源,然后调用notifyDataSetChanged()就可以了。然鹅并不是这样。

    简单记录一下最后的解决方案:

    初始化数据的时候,创建所有可能会出现的Fragment

            walletFragment = new WalletFragment();
            washFragment = new WashFragment();
            userFragment = new UserFragment();
            partnerFragment = new PartnerFragment();
    
            fragments.add(walletFragment);
            fragments.add(washFragment);
            if (currentUser == AppConstant.user) {
                fragments.add(userFragment);
            } else {
                fragments.add(partnerFragment);
            }
    
            vpMain.setOffscreenPageLimit(3);
            mainPagerAdapter = new MainPagerAdapter(getSupportFragmentManager(), fragments);
            vpMain.setAdapter(mainPagerAdapter);
            tabMain.setCurrentTab(1);
            vpMain.setCurrentItem(1, false);
    

    主要在Adapter中处理

    public class MainPagerAdapter extends FragmentPagerAdapter {
    
        private ArrayList<Fragment> fragments;
    
        public MainPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments) {
            super(fm);
            this.fragments = fragments;
        }
    
        @Override
        public int getCount() {
            return fragments.size();
        }
    
        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }
    
    
        @Override
        public long getItemId(int position) {
            return fragments.get(position).hashCode();
    
        }
    
        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }
    }
    
    

    重点是这两个方法 getItemId()getItemPosition() 通过这两个方法来解决adapger的缓存问题。

    最后在切换的时候调用

        private void switchUser(int eventIntData) {
            
            if (eventIntData == AppConstant.user) {
                //删除商户 添加用户
                if (fragments.contains(partnerFragment)) {
                    fragments.remove(partnerFragment);
                    fragments.add(2, userFragment);
                }
    
    
            } else if (eventIntData == AppConstant.partner) {
                //删除用户 添加商户
                if (fragments.contains(userFragment)) {
                    fragments.remove(userFragment);
                    fragments.add(2, partnerFragment);
                }
            }
    
            mainPagerAdapter.notifyDataSetChanged();
        }
    
    

    相关文章

      网友评论

        本文标题:ViewPager动态替换Fragment

        本文链接:https://www.haomeiwen.com/subject/ljktgqtx.html