FragmentPagerAdapter deprecated

56,347

Solution 1

UPDATE 2021-06-14: At this point, ViewPager itself is all but deprecated. Technically, ViewPager is not deprecated, but the two concrete PagerAdapter implementations — FragmentPagerAdapter and FragmentStatePagerAdapter — are deprecated. Ideally, switch to something else, such as ViewPager2 or the pager composable in Accompanist.

Replace:

class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager)

with:

class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)

(assuming that MyViewPagerAdapter does not need this value to be configurable)

Solution 2

The javadocs actually has the following deprecation notice on FragmentPagerAdapter:


This class is deprecated.

Switch to ViewPager2 and use FragmentStateAdapter instead.


Solution 3

Switch to ViewPager2 with FragmentStateAdapter.

Here is the XML view:-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>
class AdapterTabPager(activity: FragmentActivity?) : FragmentStateAdapter(activity!!) {
    private val mFragmentList: MutableList<Fragment> = ArrayList()
    private val mFragmentTitleList: MutableList<String> = ArrayList()
    
    public fun getTabTitle(position : Int): String{
        return mFragmentTitleList[position]
    }

    fun addFragment(fragment: Fragment, title: String) {
        mFragmentList.add(fragment)
        mFragmentTitleList.add(title)
    }

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

    override fun createFragment(position: Int): Fragment {
        return mFragmentList[position]
    }
}

Here is the way to instantiate ViewPager:-

val adapter = AdapterTabPager(activity)
        adapter.addFragment(categoryFragment, "Category")
        adapter.addFragment(brandFragment, "Brand")

        rootView.viewpager.adapter = adapter
        rootView.viewpager.currentItem = 0
        TabLayoutMediator(rootView.tabs, rootView.viewpager) { tab, position ->
            tab.text = adapter.getTabTitle(position)
        }.attach()

Solution 4

Need to switch to ViewPager2, they have a migration guide here.

https://developer.android.com/training/animation/vp2-migration#java

Solution 5

It seems like not only the constructor without behavior, but the class FragmentPagerAdapter (which can consume a good amount of memory by keeping Fragments in memory), and FragmentStatePagerAdapter are both in deprecation stage. I wonder what can be used to extend abstract class PagerAdapter to extend codebase lifespan.

Share:
56,347
wbk727
Author by

wbk727

Apparently, this user prefers to keep an air of mystery about them.

Updated on July 08, 2022

Comments

  • wbk727
    wbk727 almost 2 years

    Since API 27 FragmentPagerAdapter is deprecated. What's the best alternative to use for this?

    In my case, I understand something like super(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) would need to be used, but I don't know where within my code this needs to go.

    I got these imports in my class:

    import androidx.fragment.app.FragmentManager
    import androidx.fragment.app.FragmentPagerAdapter
    

    but FragmentPagerAdapter in class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){ is crossed out.

    class MyViewPagerAdapter(manager: FragmentManager) : FragmentPagerAdapter(manager){
            private val fragmentList : MutableList<androidx.fragment.app.Fragment> = ArrayList()
            private val titleList : MutableList<String> = ArrayList()
    
            override fun getItem(position: Int): androidx.fragment.app.Fragment {
                return fragmentList[position]
            }
    
            override fun getCount(): Int {
                return fragmentList.size
            }
    
            fun addFragment(fragment: androidx.fragment.app.Fragment, title: String){
                fragmentList.add(fragment)
                titleList.add(title)
            }
    
            override fun getPageTitle(position: Int): CharSequence? {
                return titleList[position]
            }
        }
    
  • Asad Mukhtar
    Asad Mukhtar over 4 years
    Why i need this after add this @SuppressLint("WrongConstant") after adding this in constructor FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT?
  • CommonsWare
    CommonsWare over 4 years
    @AsadMukhtar: I do not know, sorry. You might consider asking a separate Stack Overflow question, where you can provide a minimal reproducible example showing what you are trying and where you needed to apply that annotation.
  • Neoh
    Neoh about 4 years
    This solution does not work if you want to extend ViewPager because ViewPager2 is public final.
  • Everett
    Everett about 4 years
    I get the same problem with the constructor, it's supposed to get a LifeCycle parameter I guess.
  • sta
    sta about 3 years
    Henrik Bøgelund Lavstsen, a link to a solution is welcome, but please ensure your answer is useful without it: add context around the link so your fellow users will have some idea what it is and why it is there, then quote the most relevant part of the page you are linking to in case the target page is unavailable. Answers that are little more than a link may be deleted.
  • Feroz Khan
    Feroz Khan about 3 years
    We cannot use FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT anymore as FragmentPagerAdapter is also deprecated now.
  • CommonsWare
    CommonsWare about 3 years
    @FerozKhan: Yes, I believe that at this point ViewPager itself is deprecated.
  • EpicPandaForce
    EpicPandaForce about 3 years
    Alternately, you can say @SuppressWarnings("deprecation") in cases where ViewPager2 breaks your app behaviors :D
  • CommonsWare
    CommonsWare about 3 years
    @EpicPandaForce: Agreed, though eventually Google is going to stop updating androidx.viewpager:viewpager. Even then, you might be able to use the last-shipped version for a while, before some transitive dependency or something breaks the build as you update other stuff. So, we don't have to race and replace ViewPager this week, but I would recommend it sometime in the next year or two.
  • Pemba Tamang
    Pemba Tamang almost 3 years
  • Bhavin Solanki
    Bhavin Solanki about 2 years
    Still deprecated with the same solutions.