最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RecyclerView滑動(dòng)到指定Position的方法

 更新時(shí)間:2017年04月06日 17:16:34   作者:陸羽_  
這篇文章主要為大家詳細(xì)介紹了RecyclerView滑動(dòng)到指定Position的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

Question

最近在寫 SideBar 的時(shí)候遇到一個(gè)問(wèn)題,當(dāng)執(zhí)行 Recyclerview 的 smoothScrollToPosition(position) 的時(shí)候,Recyclerview 看上去并沒有滾動(dòng)到指定位置。

Analysis

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

·目標(biāo)position在第一個(gè)可見項(xiàng)之前 。

這種情況調(diào)用smoothScrollToPosition能夠平滑的滾動(dòng)到指定位置,并且置頂。

·目標(biāo)position在第一個(gè)可見項(xiàng)之后,最后一個(gè)可見項(xiàng)之前。

這種情況下,調(diào)用smoothScrollToPosition不會(huì)有任何效果···

·目標(biāo)position在最后一個(gè)可見項(xiàng)之后。

這種情況調(diào)用smoothScrollToPosition會(huì)把目標(biāo)項(xiàng)滑動(dòng)到屏幕最下方···

Solution

鑒于這三種情況,我想大多數(shù)情況下都無(wú)法滿足我們的滑動(dòng)要求。為了實(shí)現(xiàn) Recyclerview 把指定 item 滑動(dòng)到屏幕頂端的需求,我們需要對(duì)上面三種情況分別處理。

 /** 目標(biāo)項(xiàng)是否在最后一個(gè)可見項(xiàng)之后*/
 private boolean mShouldScroll;
 /** 記錄目標(biāo)項(xiàng)位置*/
 private int mToPosition;

 /**
 * 滑動(dòng)到指定位置
 * @param mRecyclerView
 * @param position
 */
 private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) {
 // 第一個(gè)可見位置
 int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0));
 // 最后一個(gè)可見位置
 int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1));

 if (position < firstItem) {
 // 如果跳轉(zhuǎn)位置在第一個(gè)可見位置之前,就smoothScrollToPosition可以直接跳轉(zhuǎn)
 mRecyclerView.smoothScrollToPosition(position);
 } else if (position <= lastItem) {
 // 跳轉(zhuǎn)位置在第一個(gè)可見項(xiàng)之后,最后一個(gè)可見項(xiàng)之前
 // smoothScrollToPosition根本不會(huì)動(dòng),此時(shí)調(diào)用smoothScrollBy來(lái)滑動(dòng)到指定位置
 int movePosition = position - firstItem;
 if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) {
 int top = mRecyclerView.getChildAt(movePosition).getTop();
 mRecyclerView.smoothScrollBy(0, top);
 }
 }else {
 // 如果要跳轉(zhuǎn)的位置在最后可見項(xiàng)之后,則先調(diào)用smoothScrollToPosition將要跳轉(zhuǎn)的位置滾動(dòng)到可見位置
 // 再通過(guò)onScrollStateChanged控制再次調(diào)用smoothMoveToPosition,執(zhí)行上一個(gè)判斷中的方法
 mRecyclerView.smoothScrollToPosition(position);
 mToPosition = position;
 mShouldScroll = true;
 }
 }

再通過(guò)onScrollStateChanged控制再次調(diào)用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);
 }
 }
 });
 }

目前這個(gè)解決方法有兩個(gè)已知的問(wèn)題

1、當(dāng)目標(biāo)項(xiàng)在最后一個(gè)可見項(xiàng)之后的時(shí)候,由于我們先執(zhí)行smoothScrollToPosition方法,然后在OnScrollListener中執(zhí)行smoothMoveToPosition方法,在滑動(dòng)的時(shí)候不夠連貫。
2、在手動(dòng)滑動(dòng)的時(shí)候執(zhí)行該方法,會(huì)有極小的概率滑動(dòng)的位置出現(xiàn)偏差。
如果你有更好解決辦法,希望不吝指教。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android掛斷電話最新實(shí)現(xiàn)方法

    Android掛斷電話最新實(shí)現(xiàn)方法

    大家好,本篇文章主要講的是Android掛斷電話最新實(shí)現(xiàn)方法,感興趣的同學(xué)感快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-02-02
  • Android APP性能優(yōu)化分析

    Android APP性能優(yōu)化分析

    這篇文章主要給大家講了Android APP性能優(yōu)化相關(guān)的思考以及優(yōu)化重點(diǎn)分析,需要的朋友參考下吧。
    2017-12-12
  • Kotlin文件讀寫與SharedPreferences存儲(chǔ)功能實(shí)現(xiàn)方法

    Kotlin文件讀寫與SharedPreferences存儲(chǔ)功能實(shí)現(xiàn)方法

    SharedPreferences是安卓平臺(tái)上一個(gè)輕量級(jí)的存儲(chǔ)類,用來(lái)保存應(yīng)用的一些常用配置,比如Activity狀態(tài),Activity暫停時(shí),將此activity的狀態(tài)保存到SharedPereferences中;當(dāng)Activity重載,系統(tǒng)回調(diào)方法onSaveInstanceState時(shí),再?gòu)腟haredPreferences中將值取出
    2022-12-12
  • Android使用BottomNavigationBar實(shí)現(xiàn)底部導(dǎo)航欄

    Android使用BottomNavigationBar實(shí)現(xiàn)底部導(dǎo)航欄

    這篇文章主要為大家詳細(xì)介紹了Android使用BottomNavigationBar實(shí)現(xiàn)底部導(dǎo)航欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Android實(shí)現(xiàn)EditText換行自動(dòng)縮進(jìn)功能

    Android實(shí)現(xiàn)EditText換行自動(dòng)縮進(jìn)功能

    在很多需要輸入多行文本的應(yīng)用(如記事本、編程代碼編輯器、博客編輯器等)中,自動(dòng)縮進(jìn)功能能大大提升用戶的編輯效率與體驗(yàn),本文給大家介紹了Android實(shí)現(xiàn)EditText換行自動(dòng)縮進(jìn)功能,下面提供整合后的完整代碼示例,需要的朋友可以參考下
    2025-04-04
  • Android仿QQ長(zhǎng)按刪除彈出框功能示例

    Android仿QQ長(zhǎng)按刪除彈出框功能示例

    對(duì)于列表來(lái)說(shuō),如果想操作某個(gè)列表項(xiàng),一般會(huì)采用長(zhǎng)按彈出菜單的形式,默認(rèn)的上下文菜單比較難看,而QQ的上下文菜單就人性化多了,整個(gè)菜單給用戶一種氣泡彈出的感覺,而且會(huì)顯示在手指按下的位置,接下來(lái)通過(guò)本文給大家分享Android仿QQ長(zhǎng)按刪除彈出框功能,一起看看吧
    2017-03-03
  • Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求

    Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求

    這篇文章主要為大家詳細(xì)介紹了Android自定義WaveProgressView實(shí)現(xiàn)水波紋加載需求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 常見Android選項(xiàng)菜單樣式集合

    常見Android選項(xiàng)菜單樣式集合

    這篇文章主要為大家分享了一份屬于你自己的常見Android菜單樣式集合,方便大家開發(fā)使用Android菜單,對(duì)OptionMenu感興趣的小伙伴們可以參考一下
    2016-02-02
  • Android開發(fā)實(shí)現(xiàn)撥打電話與發(fā)送信息的方法分析

    Android開發(fā)實(shí)現(xiàn)撥打電話與發(fā)送信息的方法分析

    這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)撥打電話與發(fā)送信息的方法,結(jié)合實(shí)例形式分析了Android撥打電話及發(fā)送信息相關(guān)布局、功能實(shí)現(xiàn)及權(quán)限控制操作技巧,需要的朋友可以參考下
    2017-12-12
  • Android藍(lán)牙服務(wù)啟動(dòng)流程分析探索

    Android藍(lán)牙服務(wù)啟動(dòng)流程分析探索

    這篇文章主要介紹了Android藍(lán)牙服務(wù)啟動(dòng)流程,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的
    2023-01-01

最新評(píng)論

红河县| 江口县| 信丰县| 嘉义市| 黑河市| 温州市| 铁岭市| 玉环县| 亳州市| 无锡市| 房山区| 拉萨市| 大埔县| 岳西县| 阳高县| 会东县| 黄浦区| 文化| 犍为县| 福州市| 庆城县| 黄梅县| 庆元县| 神木县| 孟州市| 青铜峡市| 荣昌县| 高邑县| 长宁县| 新闻| 随州市| 酒泉市| 舟山市| 璧山县| 天气| 阳新县| 左贡县| 锡林郭勒盟| 孟村| 京山县| 工布江达县|