diff options
| author | Chris Banes <chrisbanes@google.com> | 2015-11-03 13:31:16 +0000 |
|---|---|---|
| committer | Chris Banes <chrisbanes@google.com> | 2015-11-06 10:59:20 +0000 |
| commit | 38cc44cffde90f6fe689b0df6b82f49481a981f7 (patch) | |
| tree | 0230d9df508ed4a53251b9a9966af3690df22b8d /v4/java/android | |
| parent | f6b1b744cfa13f1df45fcda94dd104264d4d6dde (diff) | |
| download | android_frameworks_support-38cc44cffde90f6fe689b0df6b82f49481a981f7.tar.gz android_frameworks_support-38cc44cffde90f6fe689b0df6b82f49481a981f7.tar.bz2 android_frameworks_support-38cc44cffde90f6fe689b0df6b82f49481a981f7.zip | |
Add dynamic tab support to TabLayout
TabLayout will now automatically invalidate
and re-populate itself when the linked PagerAdapter
has it's data set changed.
Two objects Pools are used to minimize churn when the
adapter is updated.
A small change had to be made to ViewPager + PagerAdapter's
observing functionality. Observable will always dispatch
changed events in reverse added order, which means that
ViewPager is the last to know. This means that any later
added Observer can't update the ViewPager (since it
doesn't know about the data set change yet). This is fixed
by moving ViewPager's observer out of the Observable and
always calling it first.
BUG: 20908355
Change-Id: I631620ff186047ae57e928db78f5ca77a0b80306
Diffstat (limited to 'v4/java/android')
| -rw-r--r-- | v4/java/android/support/v4/view/PagerAdapter.java | 14 | ||||
| -rw-r--r-- | v4/java/android/support/v4/view/ViewPager.java | 4 |
2 files changed, 15 insertions, 3 deletions
diff --git a/v4/java/android/support/v4/view/PagerAdapter.java b/v4/java/android/support/v4/view/PagerAdapter.java index ef524047d0..55fb9c1324 100644 --- a/v4/java/android/support/v4/view/PagerAdapter.java +++ b/v4/java/android/support/v4/view/PagerAdapter.java @@ -76,7 +76,8 @@ import android.view.ViewGroup; * the method {@link #getItemPosition(Object)}.</p> */ public abstract class PagerAdapter { - private DataSetObservable mObservable = new DataSetObservable(); + private final DataSetObservable mObservable = new DataSetObservable(); + private DataSetObserver mViewPagerObserver; public static final int POSITION_UNCHANGED = -1; public static final int POSITION_NONE = -2; @@ -273,6 +274,11 @@ public abstract class PagerAdapter { * and associated views should update. */ public void notifyDataSetChanged() { + synchronized (this) { + if (mViewPagerObserver != null) { + mViewPagerObserver.onChanged(); + } + } mObservable.notifyChanged(); } @@ -294,6 +300,12 @@ public abstract class PagerAdapter { mObservable.unregisterObserver(observer); } + void setViewPagerObserver(DataSetObserver observer) { + synchronized (this) { + mViewPagerObserver = observer; + } + } + /** * This method may be called by the ViewPager to obtain a title string * to describe the specified page. This method may return null diff --git a/v4/java/android/support/v4/view/ViewPager.java b/v4/java/android/support/v4/view/ViewPager.java index 454ac623e1..c6f3648e32 100644 --- a/v4/java/android/support/v4/view/ViewPager.java +++ b/v4/java/android/support/v4/view/ViewPager.java @@ -418,7 +418,7 @@ public class ViewPager extends ViewGroup { */ public void setAdapter(PagerAdapter adapter) { if (mAdapter != null) { - mAdapter.unregisterDataSetObserver(mObserver); + mAdapter.setViewPagerObserver(null); mAdapter.startUpdate(this); for (int i = 0; i < mItems.size(); i++) { final ItemInfo ii = mItems.get(i); @@ -439,7 +439,7 @@ public class ViewPager extends ViewGroup { if (mObserver == null) { mObserver = new PagerObserver(); } - mAdapter.registerDataSetObserver(mObserver); + mAdapter.setViewPagerObserver(mObserver); mPopulatePending = false; final boolean wasFirstLayout = mFirstLayout; mFirstLayout = true; |
