国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

RecyclerView滑動到指定Position的方法

2019-10-23 18:32:20
字體:
來源:轉載
供稿:網友

Question

最近在寫 SideBar 的時候遇到一個問題,當執行 Recyclerview 的 smoothScrollToPosition(position) 的時候,Recyclerview 看上去并沒有滾動到指定位置。

Analysis

當然,這并不是方法的bug,而是 smoothScrollToPosition(position) 的執行效果有三種情況,需要區分。

·目標position在第一個可見項之前 。

這種情況調用smoothScrollToPosition能夠平滑的滾動到指定位置,并且置頂。

·目標position在第一個可見項之后,最后一個可見項之前。

這種情況下,調用smoothScrollToPosition不會有任何效果···

·目標position在最后一個可見項之后。

這種情況調用smoothScrollToPosition會把目標項滑動到屏幕最下方···

Solution

鑒于這三種情況,我想大多數情況下都無法滿足我們的滑動要求。為了實現 Recyclerview 把指定 item 滑動到屏幕頂端的需求,我們需要對上面三種情況分別處理。

 /** 目標項是否在最后一個可見項之后*/ private boolean mShouldScroll; /** 記錄目標項位置*/ private int mToPosition; /** * 滑動到指定位置 * @param mRecyclerView * @param position */ private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) { // 第一個可見位置 int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0)); // 最后一個可見位置 int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1)); if (position < firstItem) { // 如果跳轉位置在第一個可見位置之前,就smoothScrollToPosition可以直接跳轉 mRecyclerView.smoothScrollToPosition(position); } else if (position <= lastItem) { // 跳轉位置在第一個可見項之后,最后一個可見項之前 // smoothScrollToPosition根本不會動,此時調用smoothScrollBy來滑動到指定位置 int movePosition = position - firstItem; if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) { int top = mRecyclerView.getChildAt(movePosition).getTop(); mRecyclerView.smoothScrollBy(0, top); } }else { // 如果要跳轉的位置在最后可見項之后,則先調用smoothScrollToPosition將要跳轉的位置滾動到可見位置 // 再通過onScrollStateChanged控制再次調用smoothMoveToPosition,執行上一個判斷中的方法 mRecyclerView.smoothScrollToPosition(position); mToPosition = position; mShouldScroll = true; } }

再通過onScrollStateChanged控制再次調用smoothMoveToPosition

 mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (mShouldScroll){  mShouldScroll = false;  smoothMoveToPosition(mRecyclerView,mToPosition); } } }); }

目前這個解決方法有兩個已知的問題

1、當目標項在最后一個可見項之后的時候,由于我們先執行smoothScrollToPosition方法,然后在OnScrollListener中執行smoothMoveToPosition方法,在滑動的時候不夠連貫。
2、在手動滑動的時候執行該方法,會有極小的概率滑動的位置出現偏差。
如果你有更好解決辦法,希望不吝指教。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阜康市| 顺义区| 资阳市| 神木县| 周口市| 彩票| 旺苍县| 运城市| 砀山县| 治县。| 贵德县| 四平市| 曲靖市| 唐河县| 石阡县| 洛隆县| 武安市| 延安市| 团风县| 汶上县| 辽源市| 舞阳县| 宝兴县| 上高县| 蓬莱市| 青海省| 图木舒克市| 临夏县| 老河口市| 大石桥市| 仪陇县| 乐山市| 九江市| 云梦县| 杭锦后旗| 和龙市| 宁南县| 卢龙县| 方正县| 霍州市| 天峨县|