簡體   English   中英

如何替換 ViewPager2 中的片段

[英]How to replace fragment in ViewPager2

我已將ViewPager遷移到ViewPager2並將適配器FragmentPageAdapter遷移到FragmentStateAdaper FragmentPageAdapter中有一個名為getItemPostion(Object obj)的方法,通過使用此方法我可以替換片段。 FragmentStateAdaper class 中,該方法不存在如何用FragmentStateAdaper替換 viewpager2 中的片段。 這是我的適配器:

public class BottomNavigationIcon extends FragmentStateAdapter implements FragChangeListner {
        FragmentManager fm;
        Fragment tmp;
        public BottomNavigationIcon(@NonNull FragmentManager fragment, Lifecycle lc) {
            super(fragment,lc);
            this.fm=fragment;
        }
        @NonNull
        @Override
        public Fragment createFragment(int position) {
            if (position == 1)
                return SessionFragment.getInstance();
            if (position == 2)
                return OthersFragment.newInstance();
            if (position == 3) {
                if (tmp == null)
                    tmp = SettingsFragment.newInstance();
                return tmp;
            }
            return ProcessFragment.newInstance();
        }

        @Override
        public int getItemCount() {
            return 4;
        }

    @Override
    public void replaceFrag() { //here replacing fragment which is not working
        fm.beginTransaction().remove(tmp).commit();
        tmp = AboutFragment.newInstance();
        notifyDataSetChanged();
    }
}

在我的設置片段中,我只是調用replaceFrag()

v.findViewById(R.id.about_me).setOnClickListener(v1 -> {
            interface.replaceFrag();
        });

在遷移之前,我的適配器如下所示:

    public class MyAdapter extends FragmentPagerAdapter implements FragChangeListner
    {
        private final FragmentManager mFragmentManager;
        private Fragment tmp;
    
        public MyAdapter(FragmentManager fm)
        {
            super(fm);
            mFragmentManager = fm;
        }
    
        @Override
        public Fragment getItem(int position)
        {
            if (position == 1)
                    return SessionFragment.getInstance();
                if (position == 2)
                    return OthersFragment.newInstance();
                if (position == 3) {
                    if (tmp == null)
                        tmp = SettingsFragment.newInstance();
                    return tmp;
                }
                return ProcessFragment.newInstance();
        }
    
        @Override
        public int getCount()
        {
            return 4;
        }
    
        @Override
        public int getItemPosition(Object object)
        {
            if (object instanceof SettingsFragment && tmp instanceof AboutFragment)
                return POSITION_NONE;
            return POSITION_UNCHANGED;
        }
@Override
public void replaceFrag()
                    { //here replacing fragment which is working
                        mFragmentManager.beginTransaction().remove(tmp).commit();
                        tmp = AboutFragment.newInstance();
                        notifyDataSetChanged();
                    }
    }
    }

我的界面是

public interface FragChangeListner()
{
    void replaceFrag();
}

有什么不同的方法可以用 FragmentStateAdapter 適配器替換 viewpager2 中的片段

您必須重寫Fragment中的createFragment(position: Int)方法,該方法返回各個位置的FragmentStateAdapter

createFragment可以像這樣被覆蓋

override fun createFragment(position: Int): Fragment {
      return when (position) {
            0 -> FragmentOne()
            1 -> FragmentTwo()
            else -> FragmentOne()
        }
}

除此之外,您還必須覆蓋FragmentStateAdapter中的getItemCount() ,您必須在其中返回片段總數。

在您的活動中設置 viewpager

private fun setTabs() {
        listFragmentTitles = arrayListOf("Fragment1","Fragment2","Fragment3")
        viewPagerFragmentAdapter = 
        ViewPagerFragmentAdapter(this,listFragmentTitles)
        binding.viewPager.adapter = viewPagerFragmentAdapter
        TabLayoutMediator(
            binding.tabLayout, binding.viewPager
        ) { tab: TabLayout.Tab, position: Int ->
            tab.text = listFragmentTitles[position]
        }.attach()
    }

查看尋呼機適配器

internal class ViewPagerFragmentAdapter(
    fragmentActivity: FragmentActivity,
    listFragmentTitles: ArrayList<String>
) :
    FragmentStateAdapter(fragmentActivity) {

    val titlesList = listFragmentTitles

    override fun createFragment(position: Int): Fragment {
        when (position) {
            0 -> return Fragment1()
            1 -> return Fragment2()
            2 -> return Fragment3()
        }
        return Fragment1()
    }

    override fun getItemCount(): Int {
        return titlesList.size
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM