Адаптер ViewPager вызывает Fragment onCreateView дважды - PullRequest
0 голосов
/ 30 апреля 2020

Я столкнулся с проблемой, с которой никогда не сталкивался.

Я использую ViewPager с вкладками для отображения разных фрагментов. Некоторые вкладки отображаются в зависимости от параметра, который я передаю моему адаптеру ViewPager. Вот мой адаптер:

class MyPagerAdapter(
        supportFragmentManager: FragmentManager,
        private val value: Boolean
    ) : FragmentPagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

    private val fragmentPages: MutableList<Fragment> = mutableListOf()

    init {
        fragmentPages.add(FirstFragment.newInstance())

        fragmentPages.add(SecondFragment.newInstance())

        if (value) {
            fragmentPages.add(ThirdFragment.newInstance())
        }
    }

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

    override fun getCount(): Int {
        return fragmentPages.size
    }
}

Проблема заключается в том, что в моей деятельности, содержащей этот ViewPager, у меня есть Spinner, который в зависимости от выбранного значения обновляет адаптер ViewPager и представление моего фрагмента. загружается дважды. В FirstFragment, который всегда загружается, я выбираю данные из API и вставляю их в RecyclerView. Таким образом, я получаю дубликаты загруженных данных в моем RecyclerView, потому что метод, который загружает данные из API, который вызывается в onCreateView, вызывается дважды.

Вот мой код слушателя Spinner, который вызывается в onCreate моего Activity

mySpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            override fun onNothingSelected(parent: AdapterView<*>?) {}

            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                val value = position > 1
                adapter = MyPagerAdapter(supportFragmentManager, value)
                viewPager.adapter = adapter
            }
        }
mySpinner.setSelection(0)
...