轉:https://www.dazhuanlan.com/2019/12/16/5df6e27c71058/?__cf_chl_jschl_tk__=45b506af0a5845c229f6bcff22c07e3a50fbcabf-1609382170-0-AX6zhXvb63rOcwTNx--VLk8gWlC7KLxJkxoJdhyzcFpu2qKoP5D-4E7Ifwm2q_frwWyoZz2Tc8K2oyBtZ6sqlllnkw4C6BqmQBUKz8nVVrLNRryyAQtMa8N1dw1AvS9F7vrLz8XexzGHXccl-eiFfEu9E7n26HIPwl67cCq-W2jdrhwR-ZO392s5oQod9EO1KeiwurDvsyrJJiTbq7eBZ7MGKk5sLXicXfav_alHx_EM_2rU61WAuxYRBAGgjjwV0bcuElklPvcLTrNYZNDMgvmhVGRnVxgS8cekVmATdZkTjTEqEwObgAktShJxTfSHp-4xWWKMWgTyf8qgAJYd-7Y
前言
有個項目,需要定位recyclerView到某個item。
一般用 mRecycleview.smoothScrollToPosition(0) 滑動到頂部,具有滾動效果。
但是如果我們想滾動到任意指定位置,那么smoothScrollToPosition()
就不能保證所指定item位於屏幕頂部,以下參照網上的一些帖子做一下收藏整合:
第一種
能實現指定位置位於屏幕頂部,但是不具有平滑滾動視覺效果
1 |
if (position != -1) { |
第二種
能實現指定位置位於屏幕頂部,具有平滑滾動視覺效果
- 如果如果跳轉位置在第一個可見位置之前,就smoothScrollToPosition()可以直接跳轉;
- 如果跳轉位置在第一個可見項之后,最后一個可見項之前smoothScrollToPosition()不會滾動,調用smoothScrollBy來滑動到指定位置;
- 如果要跳轉的位置在最后可見項之后,則先調用smoothScrollToPosition()將要跳轉的位置滾動到可見位置,在addOnScrollListener()里通過onScrollStateChanged控制,調用smoothMoveToPosition,再次執行判斷;
1 |
private boolean mShouldScroll; |
特殊情況
另一種簡單粗暴的方案:項目里有要求滾動到不可視的item,而在recycler是有Holder機制,沒有顯示不加載,需要先滾動到相對應的holder,等在加載完所有的holder之后,在通過adapter設置item的內容
1 |
//具體業務, |