public abstract class

FragmentStatePagerAdapter

extends PagerAdapter

 java.lang.Object

androidx.viewpager.widget.PagerAdapter

↳androidx.legacy.app.FragmentStatePagerAdapter

Gradle dependencies

compile group: 'androidx.legacy', name: 'legacy-support-v13', version: '1.0.0'

  • groupId: androidx.legacy
  • artifactId: legacy-support-v13
  • version: 1.0.0

Artifact androidx.legacy:legacy-support-v13:1.0.0 it located at Google repository (https://maven.google.com/)

Androidx artifact mapping:

androidx.legacy:legacy-support-v13 com.android.support:support-v13

Androidx class mapping:

androidx.legacy.app.FragmentStatePagerAdapter android.support.v13.app.FragmentStatePagerAdapter

Overview

Implementation of PagerAdapter that uses a Fragment to manage each page. This class also handles saving and restoring of fragment's state.

This version of the pager is more useful when there are a large number of pages, working more like a list view. When pages are not visible to the user, their entire fragment may be destroyed, only keeping the saved state of that fragment. This allows the pager to hold on to much less memory associated with each visited page as compared to FragmentPagerAdapter at the cost of potentially more overhead when switching between pages.

When using FragmentPagerAdapter the host ViewPager must have a valid ID set.

Subclasses only need to implement FragmentStatePagerAdapter.getItem(int) and PagerAdapter.getCount() to have a working adapter.

Here is an example implementation of a pager containing fragments of lists: frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStatePagerSupport.java complete

The R.layout.fragment_pager resource of the top-level fragment is: frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_pager.xml complete

The R.layout.fragment_pager_list resource containing each individual fragment's layout is: frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_pager_list.xml complete

Summary

Fields
from PagerAdapterPOSITION_NONE, POSITION_UNCHANGED
Constructors
publicFragmentStatePagerAdapter(FragmentManager fm)

Methods
public voiddestroyItem(ViewGroup container, int position, java.lang.Object object)

public voidfinishUpdate(ViewGroup container)

public abstract FragmentgetItem(int position)

Return the Fragment associated with a specified position.

public java.lang.ObjectinstantiateItem(ViewGroup container, int position)

public booleanisViewFromObject(View view, java.lang.Object object)

public voidrestoreState(Parcelable state, java.lang.ClassLoader loader)

public ParcelablesaveState()

public voidsetPrimaryItem(ViewGroup container, int position, java.lang.Object object)

public voidstartUpdate(ViewGroup container)

from PagerAdapterdestroyItem, finishUpdate, getCount, getItemPosition, getPageTitle, getPageWidth, instantiateItem, notifyDataSetChanged, registerDataSetObserver, setPrimaryItem, startUpdate, unregisterDataSetObserver
from java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructors

public FragmentStatePagerAdapter(FragmentManager fm)

Deprecated: Use FragmentStatePagerAdapter instead.

Methods

public abstract Fragment getItem(int position)

Deprecated: Use FragmentStatePagerAdapter instead.

Return the Fragment associated with a specified position.

public void startUpdate(ViewGroup container)

Deprecated: Use FragmentStatePagerAdapter instead.

public java.lang.Object instantiateItem(ViewGroup container, int position)

Deprecated: Use FragmentStatePagerAdapter instead.

public void destroyItem(ViewGroup container, int position, java.lang.Object object)

Deprecated: Use FragmentStatePagerAdapter instead.

public void setPrimaryItem(ViewGroup container, int position, java.lang.Object object)

Deprecated: Use FragmentStatePagerAdapter instead.

public void finishUpdate(ViewGroup container)

Deprecated: Use FragmentStatePagerAdapter instead.

public boolean isViewFromObject(View view, java.lang.Object object)

Deprecated: Use FragmentStatePagerAdapter instead.

public Parcelable saveState()

Deprecated: Use FragmentStatePagerAdapter instead.

public void restoreState(Parcelable state, java.lang.ClassLoader loader)

Deprecated: Use FragmentStatePagerAdapter instead.

Source

/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.legacy.app;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.PagerAdapter;

import java.util.ArrayList;

/**
 * Implementation of {@link PagerAdapter} that
 * uses a {@link Fragment} to manage each page. This class also handles
 * saving and restoring of fragment's state.
 *
 * <p>This version of the pager is more useful when there are a large number
 * of pages, working more like a list view.  When pages are not visible to
 * the user, their entire fragment may be destroyed, only keeping the saved
 * state of that fragment.  This allows the pager to hold on to much less
 * memory associated with each visited page as compared to
 * {@link FragmentPagerAdapter} at the cost of potentially more overhead when
 * switching between pages.
 *
 * <p>When using FragmentPagerAdapter the host ViewPager must have a
 * valid ID set.</p>
 *
 * <p>Subclasses only need to implement {@link #getItem(int)}
 * and {@link #getCount()} to have a working adapter.
 *
 * <p>Here is an example implementation of a pager containing fragments of
 * lists:
 *
 * {@sample frameworks/support/samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStatePagerSupport.java
 *      complete}
 *
 * <p>The <code>R.layout.fragment_pager</code> resource of the top-level fragment is:
 *
 * {@sample frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_pager.xml
 *      complete}
 *
 * <p>The <code>R.layout.fragment_pager_list</code> resource containing each
 * individual fragment's layout is:
 *
 * {@sample frameworks/support/samples/Support4Demos/src/main/res/layout/fragment_pager_list.xml
 *      complete}
 *
 * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
 */
@Deprecated
public abstract class FragmentStatePagerAdapter extends PagerAdapter {
    private static final String TAG = "FragStatePagerAdapter";
    private static final boolean DEBUG = false;

    private final FragmentManager mFragmentManager;
    private FragmentTransaction mCurTransaction = null;

    private ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>();
    private ArrayList<Fragment> mFragments = new ArrayList<Fragment>();
    private Fragment mCurrentPrimaryItem = null;

    /**
     * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
     */
    @Deprecated
    public FragmentStatePagerAdapter(FragmentManager fm) {
        mFragmentManager = fm;
    }

    /**
     * Return the Fragment associated with a specified position.
     *
     * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
     */
    @Deprecated
    public abstract Fragment getItem(int position);

    /**
     * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
     */
    @Deprecated
    @Override
    public void startUpdate(ViewGroup container) {
        if (container.getId() == View.NO_ID) {
            throw new IllegalStateException("ViewPager with adapter " + this
                    + " requires a view id");
        }
    }

    /**
     * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
     */
    @Deprecated
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        // If we already have this item instantiated, there is nothing
        // to do.  This can happen when we are restoring the entire pager
        // from its saved state, where the fragment manager has already
        // taken care of restoring the fragments we previously had instantiated.
        if (mFragments.size() > position) {
            Fragment f = mFragments.get(position);
            if (f != null) {
                return f;
            }
        }

        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }

        Fragment fragment = getItem(position);
        if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
        if (mSavedState.size() > position) {
            Fragment.SavedState fss = mSavedState.get(position);
            if (fss != null) {
                fragment.setInitialSavedState(fss);
            }
        }
        while (mFragments.size() <= position) {
            mFragments.add(null);
        }
        fragment.setMenuVisibility(false);
        FragmentCompat.setUserVisibleHint(fragment, false);
        mFragments.set(position, fragment);
        mCurTransaction.add(container.getId(), fragment);

        return fragment;
    }

    /**
     * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
     */
    @Deprecated
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment) object;

        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
        if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
                + " v=" + ((Fragment)object).getView());
        while (mSavedState.size() <= position) {
            mSavedState.add(null);
        }
        mSavedState.set(position, fragment.isAdded()
                ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
        mFragments.set(position, null);

        mCurTransaction.remove(fragment);
    }

    /**
     * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
     */
    @Deprecated
    @SuppressWarnings("ReferenceEquality")
    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment)object;
        if (fragment != mCurrentPrimaryItem) {
            if (mCurrentPrimaryItem != null) {
                mCurrentPrimaryItem.setMenuVisibility(false);
                FragmentCompat.setUserVisibleHint(mCurrentPrimaryItem, false);
            }
            if (fragment != null) {
                fragment.setMenuVisibility(true);
                FragmentCompat.setUserVisibleHint(fragment, true);
            }
            mCurrentPrimaryItem = fragment;
        }
    }

    /**
     * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
     */
    @Deprecated
    @Override
    public void finishUpdate(ViewGroup container) {
        if (mCurTransaction != null) {
            mCurTransaction.commitAllowingStateLoss();
            mCurTransaction = null;
            mFragmentManager.executePendingTransactions();
        }
    }

    /**
     * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
     */
    @Deprecated
    @Override
    public boolean isViewFromObject(View view, Object object) {
        return ((Fragment)object).getView() == view;
    }

    /**
     * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
     */
    @Deprecated
    @Override
    public Parcelable saveState() {
        Bundle state = null;
        if (mSavedState.size() > 0) {
            state = new Bundle();
            Fragment.SavedState[] fss = new Fragment.SavedState[mSavedState.size()];
            mSavedState.toArray(fss);
            state.putParcelableArray("states", fss);
        }
        for (int i=0; i<mFragments.size(); i++) {
            Fragment f = mFragments.get(i);
            if (f != null && f.isAdded()) {
                if (state == null) {
                    state = new Bundle();
                }
                String key = "f" + i;
                mFragmentManager.putFragment(state, key, f);
            }
        }
        return state;
    }

    /**
     * @deprecated Use {@link androidx.fragment.app.FragmentStatePagerAdapter} instead.
     */
    @Deprecated
    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {
        if (state != null) {
            Bundle bundle = (Bundle)state;
            bundle.setClassLoader(loader);
            Parcelable[] fss = bundle.getParcelableArray("states");
            mSavedState.clear();
            mFragments.clear();
            if (fss != null) {
                for (int i=0; i<fss.length; i++) {
                    mSavedState.add((Fragment.SavedState)fss[i]);
                }
            }
            Iterable<String> keys = bundle.keySet();
            for (String key: keys) {
                if (key.startsWith("f")) {
                    int index = Integer.parseInt(key.substring(1));
                    Fragment f = mFragmentManager.getFragment(bundle, key);
                    if (f != null) {
                        while (mFragments.size() <= index) {
                            mFragments.add(null);
                        }
                        FragmentCompat.setMenuVisibility(f, false);
                        mFragments.set(index, f);
                    } else {
                        Log.w(TAG, "Bad fragment at key " + key);
                    }
                }
            }
        }
    }
}