簡體   English   中英

滾動頁面時滾動ViewPager的RecyclerView

[英]Scroll ViewPager's RecyclerView when page gets scrolled

我有一個ViewPager,其中有幾個RecyclerViews作為頁面。 我想實現以下功能:用戶開始滾動頁面后,其他頁面上的RecyclerViews移動一定量。

@Override
public void onPageScrolled(int position, float offset, int offsetPx) {
    RecyclerView view1 = getPage(position - 1);
    RecyclerView view2 = getPage(position + 1);

    if(scrollNeeded()) {
      view1.scrollBy(0, 200);
      view2.scrollBy(0, 200);
    }
}

我的問題是,如果我在ViewPager中緩慢滾動,一切都會正常,但是如果我快速滾動,某些RecyclerView不會滾動。 我想我需要以某種方式同步此方法。

任何想法如何解決這個問題? 用戶不應看到該滾動。

ViewPager保持+1頁的左右預加載。 意思是

  • 從頭開始-當前頁面和下一頁
  • 在最后-最后一頁和上一頁
  • 其他任何地方-當前,上一個和下一個

當用戶真正快速瀏覽頁面時,確實存在頁面(您的RecyclerView實例及其適配器)仍在准備中的情況,因此他們錯過了scrollBy()調用。

您可以用不同的方法解決此問題。

  1. 最簡單的方法是通過調用viewPager.setOffscreenPageLimit(3) -以獲得更多ViewPager.setOffScreenPageLimit(int)來增加屏幕外緩存頁面的數量(例如3 如果您每次用戶滑動時都依靠頁面刷新,則可能是一個問題。

  2. 另一個選擇是為您的RecyclerView頁面創建一個自定義視圖,並添加一個滾動值以從外部進行設置,例如

     // in your custom page view private RecyclerView.Adapter adapter; private boolean needToScroll; public void setNeedToScroll(boolean needToScroll) { this.needToScroll = needToScroll; // if adapter is not null (ie already set), scroll as is // and set the value to false if (adapter != null) { this.needToScroll = false; scrollBy(0, 200); } } // and then in the place where you define your adapter, but after setting it if (needToScroll) { needToScroll = false; scrollBy(0, 200); } 

    最后,您的視圖分頁器滾動偵聽器

     @Override public void onPageScrolled(int position, float offset, int offsetPx) { if(scrollNeeded()) { Page view1 = getPage(position - 1); Page view2 = getPage(position + 1); view1.needToScroll(true); view2.needToScroll(true); } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM