|
51 | 51 | * <li>{@link #saveState()}</li> |
52 | 52 | * <li>{@link #restoreState(Parcelable, ClassLoader)}</li> |
53 | 53 | * </ul> |
| 54 | + * |
| 55 | + * @deprecated Switch to {@link androidx.viewpager2.widget.ViewPager2} and use |
| 56 | + * {@link androidx.viewpager2.adapter.FragmentStateAdapter} instead. |
54 | 57 | */ |
55 | 58 | @SuppressWarnings("deprecation") |
| 59 | +@Deprecated |
56 | 60 | public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapter { |
57 | 61 | private static final String TAG = "FragmentStatePagerAdapt"; |
58 | 62 | private static final boolean DEBUG = false; |
@@ -86,9 +90,10 @@ public abstract class FragmentStatePagerAdapterMenuWorkaround extends PagerAdapt |
86 | 90 | private final int mBehavior; |
87 | 91 | private FragmentTransaction mCurTransaction = null; |
88 | 92 |
|
89 | | - private final ArrayList<Fragment.SavedState> mSavedState = new ArrayList<Fragment.SavedState>(); |
90 | | - private final ArrayList<Fragment> mFragments = new ArrayList<Fragment>(); |
| 93 | + private final ArrayList<Fragment.SavedState> mSavedState = new ArrayList<>(); |
| 94 | + private final ArrayList<Fragment> mFragments = new ArrayList<>(); |
91 | 95 | private Fragment mCurrentPrimaryItem = null; |
| 96 | + private boolean mExecutingFinishUpdate; |
92 | 97 |
|
93 | 98 | /** |
94 | 99 | * Constructor for {@link FragmentStatePagerAdapterMenuWorkaround} |
@@ -208,7 +213,7 @@ public void destroyItem(@NonNull final ViewGroup container, final int position, |
208 | 213 | mFragments.set(position, null); |
209 | 214 |
|
210 | 215 | mCurTransaction.remove(fragment); |
211 | | - if (fragment == mCurrentPrimaryItem) { |
| 216 | + if (fragment.equals(mCurrentPrimaryItem)) { |
212 | 217 | mCurrentPrimaryItem = null; |
213 | 218 | } |
214 | 219 | } |
@@ -247,7 +252,19 @@ public void setPrimaryItem(@NonNull final ViewGroup container, final int positio |
247 | 252 | @Override |
248 | 253 | public void finishUpdate(@NonNull final ViewGroup container) { |
249 | 254 | if (mCurTransaction != null) { |
250 | | - mCurTransaction.commitNowAllowingStateLoss(); |
| 255 | + // We drop any transactions that attempt to be committed |
| 256 | + // from a re-entrant call to finishUpdate(). We need to |
| 257 | + // do this as a workaround for Robolectric running measure/layout |
| 258 | + // calls inline rather than allowing them to be posted |
| 259 | + // as they would on a real device. |
| 260 | + if (!mExecutingFinishUpdate) { |
| 261 | + try { |
| 262 | + mExecutingFinishUpdate = true; |
| 263 | + mCurTransaction.commitNowAllowingStateLoss(); |
| 264 | + } finally { |
| 265 | + mExecutingFinishUpdate = false; |
| 266 | + } |
| 267 | + } |
251 | 268 | mCurTransaction = null; |
252 | 269 | } |
253 | 270 | } |
|
0 commit comments