musooff
musooff

Reputation: 6852

ViewPager Fragments are not initialized immediately

I have a ViewPager with an adapter of FragmentStatePagerAdapter. For the sake of simplicity I have 2 Fragments within my ViewPager.

class MyPagerAdapter(fragmentManager: FragmentManager): FragmentStatePagerAdapter(fragmentManager) {
    var firstFragment: SampleFragment? = null
    var secondFragment: SampleFragment? = null

    override fun getItem(position: Int): Fragment {
        return when(position) {
            0 -> SampleFragment()
                .also { firstFragment = it }
            1 -> SampleFragment()
                .also { secondFragment = it }
            else -> Fragment()
        }
    }

    override fun getCount(): Int {
        return 2
    }

}

My SampleFragment is a simple Fragment with a TextView on it's view.

class SampleFragment: Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_sample, container, false)
    }

    fun setText(text: String) {
        text_view.text = text
    }
}

Now I am on my MainActivity where I have ViewPager, I have below lines

val adapter = MyPagerAdapter(supportFragmentManager)
view_pager.adapter = adapter

adapter.firstFragment?.setText("Some Text")

So, here is a problem. After initializing (setting adapter) my ViewPager I expect my fragments are created. But it is not the case. My fragments are initialized after a certain delay. So when I want to set text of TextView inside my fragment with the line

adapter.firstFragment?.setText("Some Text")

firstFragment is null.

When I debug, I see that after

view_pager.adapter = adapter

getCount() of adapter is getting called. And then adapter.firstFragment?.setText("Some Text") will be executed which doesn't have any effect as firstFragment is null. And after a second or so getItem() of adapter is getting called.

So my question is why is my viewpager adapter fragments aren't getting initialized immediately. If I am missing something could you point out. Or it is expected behavior of ViewPager Adapter then how can I make viewpager fragments get initialized whenever pager is initialized?

Upvotes: 1

Views: 1532

Answers (1)

Ferran
Ferran

Reputation: 1448

Keep in mind that while creating your adapter, you are running onCreate from your Activity. Fragments views initializations are done only after Activity has finished his own view initialization. So, fragments views are not accessible in onCreate.

So, to initialize some fragment values you can do this: (code in java, you can change to Kotlin...)

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i1) {
        }

        @Override
        public void onPageSelected(int i) {
            switch (i) {
                case 0:
                   // init for first fragment
                break;   
                case 1:
                   // init for second fragment
                break; 
            }
        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });

Upvotes: 1

Related Questions