Index: chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java |
index 1db039439303053043116bb0c0557a051b9ac763..e4673668ef55125a9d7bb568bd3dd8e858ad010d 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/cards/NewTabPageRecyclerView.java |
@@ -82,6 +82,9 @@ public class NewTabPageRecyclerView extends RecyclerView implements TouchDisable |
/** Whether the above-the-fold left space for a peeking card to be displayed. */ |
private boolean mHasSpaceForPeekingCard; |
+ /** Whether the above-the-fold view has ever been rendered. */ |
+ private boolean mHasRenderedAboveTheFoldView; |
+ |
/** |
* Constructor needed to inflate from XML. |
*/ |
@@ -108,6 +111,19 @@ public class NewTabPageRecyclerView extends RecyclerView implements TouchDisable |
res.getDimensionPixelSize(R.dimen.snippets_peeking_card_bounce_distance); |
setHasFixedSize(true); |
+ |
+ addOnChildAttachStateChangeListener(new OnChildAttachStateChangeListener() { |
+ @Override |
+ public void onChildViewAttachedToWindow(View view) { |
+ if (view == mAboveTheFoldView) { |
+ mHasRenderedAboveTheFoldView = true; |
+ removeOnChildAttachStateChangeListener(this); |
+ } |
+ } |
+ |
+ @Override |
+ public void onChildViewDetachedFromWindow(View view) {} |
+ }); |
} |
public boolean isFirstItemVisible() { |
@@ -207,8 +223,11 @@ public class NewTabPageRecyclerView extends RecyclerView implements TouchDisable |
return 0; |
} |
- // We have enough items to fill the view, since the above-the-fold item is not even visible. |
- if (firstVisiblePos > aboveTheFoldPosition) { |
+ if (firstVisiblePos > aboveTheFoldPosition && mHasRenderedAboveTheFoldView) { |
+ // We have enough items to fill the viewport, since we have scrolled past the |
+ // above-the-fold item. We must check whether the above-the-fold view has been rendered |
+ // at least once, because it's possible to skip right over it if the initial scroll |
+ // position is not 0, in which case we may need the spacer to be taller than 0. |
return 0; |
} |