Как просмотреть только некоторые фрагменты в ViewPager - PullRequest
0 голосов
/ 28 марта 2020

У меня есть ViewPager и некоторые фрагменты. Я могу добавить все фрагменты вместе в ViewPager для просмотра в целом. Например: у меня есть фрагменты, названные как Apple, Orange, Banana, Man go, Grapes, Cherry: 6 вкладок Пользователю будет предоставлена ​​возможность выбрать любые три из этих фруктов. Итак, пусть пользователь выбрал Apple, Banana и Grapes Теперь ViewPager должен отображать только 3 вкладки Apple, Banana и Grapes.

Как я могу это сделать? Я могу установить целые фрукты в нескольких вкладках. Но, в зависимости от выбора, нежелательные вкладки необходимо удалить или добавить только нужные вкладки.

У меня есть этот код в качестве адаптера:

public class FruitFragAdapter extends FragmentStatePagerAdapter
{
    public FruitFragAdapter(FragmentManager fm)
    {
        super(fm);
    }


    public Fragment getItem(int position)
    {
        switch (position)
        {
            case 0: return new AppleFragment();
            case 1: return new OrangeFragment();
            case 2: return new BananaFragment();
            case 3: return new MangoFragment();
            case 4: return new GrapesFragment();
            case 5: return new CherryFragment();
        }
        return null;
    }


    @Override
    public int getCount()
    {
        return 6;
    }


    public CharSequence getPageTitle(int position)
    {
        switch (position)
        {
            case 0: return "Apple";
            case 1: return "Orange";
            case 2: return "Banana";
            case 3: return "Mango";
            case 4: return "Grapes";
            case 5: return "Cherry";
            default: return null;
        }
    }
}

1 Ответ

1 голос
/ 28 марта 2020

Вы могли бы сделать что-то вроде этого.

Из выбранных пользователем фрагментов создайте IntArray, например [0,3,4] или [3,4,2,1] et c ..

Инициализируйте адаптер с помощью этот IntArray выбранного фрагмента.

В getItem возвращает фрагмент, который пользователь выбрал для этой указанной c позиции. В этом примере я создал для этого функцию getFragmentBySelectedPosition.

getCount возвращает количество выбранных фрагментов (длина IntArray)

class FruitFragAdapter(fm: FragmentManager, private val selectedFragments: IntArray) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

    private val appleFragment by lazy {
        AppleFragment().newInstance()
    }

    private val orangeFragment by lazy {
        OrangeFragment().newInstance()
    }

    private val bananaFragment by lazy {
        BananaFragment().newInstance()
    }

    private val mangoFragment by lazy {
        MangoFragment().newInstance()
    }

    private val grapesFragment by lazy {
        GrapesFragment().newInstance()
    }

    private val cherryFragment by lazy {
        CherryFragment().newInstance()
    }

    private fun getFragmentBySelectedPosition(position: Int): Fragment {
        return when (position) {
            0 -> appleFragment
            1 -> orangeFragment
            2 -> bananaFragment
            3 -> mangoFragment
            4 -> grapesFragment
            5 -> cherryFragment
            else -> throw IllegalArgumentException("No fragment for: $position")
        }
    }

    override fun getItem(position: Int): Fragment {
        return getFragmentBySelectedPosition(selectedFragments[position])
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return when (selectedFragments[position]) {
            0 -> "Apple"
            1 -> "Orange"
            2 -> "Banana"
            3 -> "Mango"
            4 -> "Grapes"
            5 -> "Cherry"
            else -> ""
        }
    }

    override fun getCount(): Int {
        return selectedFragments.count()
    }
}
...