1

It is an activity hosting a pager fragment which has android.support.v4.view.ViewPager and the adapter class derived from FragmentStatePagerAdapter.

The problem is from the pager fragment it has two or three fragments cached, but the data is not parseable (including a view dynamically getting from a 3rd part sdk), when sometime os recreate this fragment in case like minimize/reopen it, or after rotation the restored fragment are blank (using the one from cache and lacking data).

Not find a way to re-populate the fragments restored by os through the pager fragment's recreation flow.

Even tried in the pager fragment to clear the adapter's data in onActivityCreated()

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val childFragmentManager = childFragmentManager
        mAdapter = ContentPagerAdapter( activity as Context, 
                         childFragmentManager, emptyList()) 
        mContentViewPager!!.setAdapter(mAdapter)
        mAdapter?.setData(emptyList())
    }

the adapter:

fun setData(itemsList: List<Data>) {
    this.data = itemsList
    notifyDataSetChanged()
}

the viewPager seems still showing the previous cachhed fragment without expected data after the re-creation flow is complete. (tried to make sure it is from the cached one, by in the fragment's onsaveInstance() to save the position of the data in the adapter data list, and the re-created fragment in the viewPager got that position, so it is a os re-created one from cache. But how could it be after at beging already set the adapter with empty list at onActivityCreated()).

Cannt resolve with clean the fragments by setting data to empty.

So tried to remove the page fragment from the activity at onDestroy() with hope that there will be no fragment to be put in cache:

class ContentPagerFragment :Fragment {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        val view = inflater.inflate(R.layout.content_pager, container, false)
        mContentViewPager = view.findViewById(R.id.contentViewPager)

        return view
     }


    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        val childFragmentManager = childFragmentManager
        mAdapter = ContentPagerAdapter( activity as Context, 
                         childFragmentManager, emptyList()) 
        mContentViewPager!!.setAdapter(mAdapter)
        mAdapter?.setData(emptyList())
    }

    interface RemoveFragmentAtClose {
        fun onContentPagerFragmentDoestroy()
    }

    override fun onDestroy() {
        (activity as? RemoveAtCloseFragment)?
            .onContentPagerFragmentDoestroy()
        super.onDestroy()
    }

}

and in the hosting activity

class HostActivity : AppCompatActivity(), 
                     ContentPagerFragment.RemoveFragmentAtClose {

    override fun onContentPagerFragmentDoestroy() {
                 supportFragmentManager.beginTransaction().
        remove(supportFragmentManager.findFragmentById(R.id.pagerFragmentContainer))
            .commitAllowingStateLoss()

        var contentPagerFragment = ContentPagerFragment::class.java.cast(supportFragmentManager
            .findFragmentById(R.id.pagerFragmentContainer))

        Log.i(TAG, " onContentPagerFragmentDoestroy(), this $this" +
            "\ngetContentPagerFragment: $contentPagerFragment"
        )
    }

    override fun onAttachFragment(fragment: Fragment) {
        Log.d(TAG, " onAttachFragment(), " +
            "fragment: $fragment \nthis $this")
    }

}

But the log shows that the supportFragmentManager.findFragmentById(R.id.pagerFragmentContainer) still find the fragment after the .commitAllowingStateLoss() call.

And when os restores the activity the ContentPagerFragment is showing up in the activity's onAttachFragment(fragment: Fragment) before activity's onCreate(savedInstanceState: Bundle?) is called.

Why is the viewPager using the old fragment after remove the pager fragment from the activity's supportFragmentManager?

How to prevent the view pager from use the cached fragment?

lannyf
  • 9,865
  • 12
  • 70
  • 152

0 Answers0