diff --git a/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java b/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java
index 433c155c258..6394433773c 100644
--- a/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java
+++ b/app/src/main/java/androidx/fragment/app/FragmentStatePagerAdapterMenuWorkaround.java
@@ -51,8 +51,12 @@
*
{@link #saveState()}
* {@link #restoreState(Parcelable, ClassLoader)}
*
+ *
+ * @deprecated Switch to {@link androidx.viewpager2.widget.ViewPager2} and use
+ * {@link androidx.viewpager2.adapter.FragmentStateAdapter} instead.
*/
@SuppressWarnings("deprecation")
+@Deprecated
public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapter {
private static final String TAG = "FragmentStatePagerAdapt";
private static final boolean DEBUG = false;
@@ -86,9 +90,10 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt
private final int mBehavior;
private FragmentTransaction mCurTransaction = null;
- private final ArrayList mSavedState = new ArrayList();
- private final ArrayList mFragments = new ArrayList();
+ private final ArrayList mSavedState = new ArrayList<>();
+ private final ArrayList mFragments = new ArrayList<>();
private Fragment mCurrentPrimaryItem = null;
+ private boolean mExecutingFinishUpdate;
/**
* Constructor for {@link FragmentStatePagerAdapterMenuWorkaround}
@@ -208,7 +213,7 @@ public void destroyItem(@NonNull final ViewGroup container, final int position,
mFragments.set(position, null);
mCurTransaction.remove(fragment);
- if (fragment == mCurrentPrimaryItem) {
+ if (fragment.equals(mCurrentPrimaryItem)) {
mCurrentPrimaryItem = null;
}
}
@@ -247,7 +252,19 @@ public void setPrimaryItem(@NonNull final ViewGroup container, final int positio
@Override
public void finishUpdate(@NonNull final ViewGroup container) {
if (mCurTransaction != null) {
- mCurTransaction.commitNowAllowingStateLoss();
+ // We drop any transactions that attempt to be committed
+ // from a re-entrant call to finishUpdate(). We need to
+ // do this as a workaround for Robolectric running measure/layout
+ // calls inline rather than allowing them to be posted
+ // as they would on a real device.
+ if (!mExecutingFinishUpdate) {
+ try {
+ mExecutingFinishUpdate = true;
+ mCurTransaction.commitNowAllowingStateLoss();
+ } finally {
+ mExecutingFinishUpdate = false;
+ }
+ }
mCurTransaction = null;
}
}