2021年3月5日金曜日

ViewPager2 で 遠くのページに smoothScroll するときは 3ページ前から作られる

最初 index : 0

タブクリックで index : 15 のページに移動

タブクリックで index : 4 のページに移動


したときの Fragment のライフサイクルの結果は次のようになります。
  1. : onCreate : 0  
  2. : onCreate : 12  
  3. : onCreate : 13  
  4. : onCreate : 14  
  5. : onCreate : 15  
  6. : onDestroy : 0  
  7. : onDestroy : 12  
  8. : onCreate : 7  
  9. : onDestroy : 13  
  10. : onCreate : 6  
  11. : onCreate : 5  
  12. : onDestroy : 14  
  13. : onCreate : 4  
  14. : onDestroy : 15  
  15. : onDestroy : 7  
index : 0 から index : 15 のページに移動するとき、index : 12 のページから作られていることがわかります。
同じように index : 15 から index : 4 のページに移動するときは index : 7 のページから作られていることがわかります。


この 3 ページ前からというロジックは ViewPager2 の setCurrentItemInternal() に実装されています。
  1. void setCurrentItemInternal(int item, boolean smoothScroll) {  
  2.   
  3.     ...  
  4.   
  5.     // For smooth scroll, pre-jump to nearby item for long jumps.  
  6.     if (Math.abs(item - previousItem) > 3) {  
  7.         mRecyclerView.scrollToPosition(item > previousItem ? item - 3 : item + 3);  
  8.         // TODO(b/114361680): call smoothScrollToPosition synchronously (blocked by b/114019007)  
  9.         mRecyclerView.post(new SmoothScrollToPosition(item, mRecyclerView));  
  10.     } else {  
  11.         mRecyclerView.smoothScrollToPosition(item);  
  12.     }  
  13. }  




0 件のコメント:

コメントを投稿