summaryrefslogtreecommitdiffstats
path: root/v4/java/android
diff options
context:
space:
mode:
authorChris Banes <chrisbanes@google.com>2015-11-03 13:31:16 +0000
committerChris Banes <chrisbanes@google.com>2015-11-06 10:59:20 +0000
commit38cc44cffde90f6fe689b0df6b82f49481a981f7 (patch)
tree0230d9df508ed4a53251b9a9966af3690df22b8d /v4/java/android
parentf6b1b744cfa13f1df45fcda94dd104264d4d6dde (diff)
downloadandroid_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.java14
-rw-r--r--v4/java/android/support/v4/view/ViewPager.java4
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;