Viewpager+tavlayout动态更新viewpager下的fragment

最近有个需求,需要在一个viewpager下点击fragment的按钮,将当前fragment替换成其他的fragment、再次点击替换后的fragment的按钮。替换回来。

首先是三个fragment布局,只有一个按钮。为了方便展示。vieepager下展示两个,另一个作为替换fragment

activity布局不用说,一个tablayout一个viewpager

然后在activity中声明

    private TabLayout mTabLayout;
    private ViewPager mViewPager;
    //页卡标题
    private List<String> tabTitleList = new ArrayList<>();
    //界面布局
    private List<Fragment> mFragmentList = new ArrayList<>();
    //fragment   tag
    private boolean fragmentsUpdateFlag[] = {false, false};

重点是viewpager设置适配器,这里的getItemPosition要设置成POSITION_NONE;

 final FragmentPagerAdapter pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return mFragmentList.get(position);
            }

            @Override
            public int getCount() {
                return mFragmentList.size();
            }

            @Override
            public CharSequence getPageTitle(int position) {
                return tabTitleList.get(position);
            }

            @Override
            public int getItemPosition(Object object) {
                return POSITION_NONE;
            }


            //更换fragment
            @Override
            public Object instantiateItem(ViewGroup container, int position) {

                //得到缓存的fragment
                Fragment fragment = (Fragment) super.instantiateItem(container, position);
                //得到tag
                String fragmentTag = fragment.getTag();
                //如果这个fragment需要更新
                if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]) {
                    FragmentManager fragmentManager = getSupportFragmentManager();
                    FragmentTransaction transaction = fragmentManager.beginTransaction();
                    //移除旧的fragment
                    transaction.remove(fragment);
                    //替换成新的fragment
                    fragment = mFragmentList.get(position % mFragmentList.size());
                    //添加新fragment时必须用前面获得的tag ❶
                    transaction.add(container.getId(), fragment, fragmentTag);
                    transaction.attach(fragment);
                    transaction.commit();
                    //复位更新标志
                    fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;
                }
                return fragment;
            }
        };

然后在需要fragment中设置监听,需要替换的fragment都像这样设置

public class FragmentOne extends Fragment {

    private static OnClickFragmentListener fragmentListener;
    private Button button;  
    private View view;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_one, container, false);
        return view;
    }

    //初始化搜素、监听
    private void initView() {

         button= (Button) view.findViewById(R.id.btn_one);
        //点击更换当前fragment
        button.setClickListener(new ItemClickListener() {
            @Override
            public void onclick(int position) {
                fragmentListener.onclick();
            }
        });
   
    }

public static void setFragmentListener(OnClickFragmentListener listener) {
        fragmentListener = listener;
    }

}

然后在activity中处理回调

 FragmentOne.setFragmentListener(new OnClickFragmentListener() {
            @Override
            public void onclick() {
                //点击切换按钮
                //设置fragment2的tag为true
                fragmentsUpdateFlag[1] = true;
                //替换fragment
                mFragmentList.set(1, fragmentTwo);
                pagerAdapter.notifyDataSetChanged();
            }
        });

同理

 FragmentTwo.setFragmentListener(new OnClickFragmentListener() {
            @Override
            public void onclick() {
                //点击切换按钮
                //设置fragment1的tag为true
                fragmentsUpdateFlag[0] = true;
                //替换fragment
                mFragmentList.set(1, fragmentOne);
                pagerAdapter.notifyDataSetChanged();
            }
        });

大致像这样就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值