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

Android獲取RecyclerView滑動距離方法詳細講解

 更新時間:2023年01月13日 09:02:07   作者:AllenC6  
RecyclerView是Android一個更強大的控件,其不僅可以實現(xiàn)和ListView同樣的效果,還有優(yōu)化了ListView中的各種不足。其可以實現(xiàn)數(shù)據(jù)縱向滾動,也可以實現(xiàn)橫向滾動(ListView做不到橫向滾動)。接下來講解RecyclerView的用法

先說能用的究極解決方案,大家著急的直接復制走,以后想了解再過來看

沒有header,且所有Item的高度一致

    private fun getScrollYDistance(recyclerView: RecyclerView): Int? {
        kotlin.runCatching {
            val layoutManager = recyclerView.layoutManager as LinearLayoutManager
            val position = layoutManager.findFirstVisibleItemPosition()
            val firstVisibleChildView = layoutManager.findViewByPosition(position)
            val itemHeight = firstVisibleChildView!!.height
            return position * itemHeight - firstVisibleChildView.top
        }
        return null
    }

有一個header,其他所有Item高度一致

    var headerHeight = 0
    private fun getScrollYDistance(recyclerView: RecyclerView): Int? {
        kotlin.runCatching {
            val layoutManager = recyclerView.layoutManager as LinearLayoutManager
            val position = layoutManager.findFirstVisibleItemPosition()
            if (position == 0) {
                val headerView = layoutManager.findViewByPosition(0)
                headerHeight = headerView!!.height
            }
            val firstVisibleChildView = layoutManager.findViewByPosition(position)
            val itemHeight = firstVisibleChildView!!.height
            return if (position == 0) {
                position * itemHeight - firstVisibleChildView.top
            } else {
                (position - 1) * itemHeight - firstVisibleChildView.top + headerHeight
            }
        }
        return null
    }

有多個header,其他Item一致

   Integer[] headerHeightArray;
    private int getScollYDistance(){
        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getRecyclerView().getLayoutManager();
        // 獲取第一個可見item的位置
        int position = layoutManager.findFirstVisibleItemPosition();
        // 獲取第一個可見item
        View firstVisiableChildView = layoutManager.findViewByPosition(position);
        // 必須考慮有沒有Header  預存下所有header的高度
        int headerCount = adapter.getHeaderCount();
        if (headerCount > 0) {
            if (headerHeightArray == null) {
                headerHeightArray = new Integer[headerCount];
            }
            if (position < headerCount) {
                View headerView_i = layoutManager.findViewByPosition(position);
                headerHeightArray[position] = headerView_i.getHeight();
            }
        }
        // 獲取第一個可見item的高度
        int itemHeight = firstVisiableChildView.getHeight();
        // 獲取第一個可見item的位置
        int distance = 0;
        if (position == 0) {
            distance = position * itemHeight - firstVisiableChildView.getTop();
        } else {
            int allHeaderHeight = 0;
            for (int i = 0; i < Math.min(position,headerCount); i++) {
                allHeaderHeight = allHeaderHeight + headerHeightArray[i];
            }
            distance = (position - Math.min(position,headerCount)) * itemHeight - firstVisiableChildView.getTop() + allHeaderHeight;
        }
        return distance;
    }

注意調(diào)用位置:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    getScollYDistance();
                }
            });

試過的一些想法,都有一些問題,有的可以彌補,有的直接玩完

RecyclerView 雖然有getScrollX() 和 getScrollY(), 但是測試發(fā)現(xiàn)這兩個函數(shù)總是返回0,太無語了。因此想到了下面幾種方法來實現(xiàn)獲取滑動距離:

利用OnScrollListener

        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            private int totalDy = ;
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                totalDy -= dy;
            }
        });

如代碼所述,totalDy的確保存了 RecyclerView 的滑動距離,但是當我向下滑動 RecyclerView ,之后插入/刪除/移動 Item 的時候,totalDy 就變得不精確了;比如刪除或者插入新的Item,那么totalDy就不能再回歸到 0了。這個可以通過當刪除或者插入時來對totalDy進行加減相應的高度。

totalDy = recyclerView.computeVerticalScrollOffset();

然而compute方法計算出的并不是滑動的精確距離,stackOverflow上有答案解釋其為 item 的平均高度 * 可見 item 數(shù)目,不是我們需要的精確距離。

totalDy = recyclerView.getChildAt().getTop();

依靠第一個item的滑動距離來進行動畫的設置,但是根據(jù)該方法得出的 totalDy 在滑動到一定程度后清零。

這是因為recyclerViewl.getChildAt(0) 返回的永遠是第一個可見的child,不是所有view list 的第一個child,因此這種用法是得不到滑動距離的。

另外下面這三種用法都是等價的,都是獲取第一個可見的child:

       LinearLayoutManager layoutManager = (LinearLayoutManager) this.getLayoutManager();
       View firstVisiableChildView = this.getChildAt();
       View firstVisiableChildView = layoutManager.getChildAt()
       int position = layoutManager.findFirstVisibleItemPosition();
       View firstVisiableChildView = layoutManager.getChildAt(position)

但是下面這種就不是獲取第一個可見的child,而是獲得所有view list 的第一個child。但是滑動一段距離后它總是返回null,即第一個child被recycle后,總是返回null。

//Don't use this function to get the first item, it will return null when the first item is recycled.
LinearLayoutManager layoutManager = (LinearLayoutManager) this.getLayoutManager();
View child2 = layoutManager.findViewByPosition();

到此這篇關于Android獲取RecyclerView滑動距離方法詳細講解的文章就介紹到這了,更多相關Android獲取RecyclerView滑動距離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • android View 繪制完成監(jiān)聽的實現(xiàn)方法

    android View 繪制完成監(jiān)聽的實現(xiàn)方法

    今天小編就為大家分享一篇android View 繪制完成監(jiān)聽的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • Android連接服務器端的Socket的實例代碼

    Android連接服務器端的Socket的實例代碼

    這篇文章主要介紹了Android連接服務器端的Socket的實例代碼,需要的朋友可以參考下
    2017-05-05
  • Android編程獲取全局Context的方法

    Android編程獲取全局Context的方法

    這篇文章主要介紹了Android編程獲取全局Context的方法,實例分析了基于Application類獲取全局Context的實現(xiàn)步驟與相關技巧,需要的朋友可以參考下
    2016-01-01
  • Android 監(jiān)聽應用前/后臺切換實例代碼

    Android 監(jiān)聽應用前/后臺切換實例代碼

    本篇文章主要介紹了Android 監(jiān)聽應用前/后臺切換實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 詳解Android中Handler的實現(xiàn)原理

    詳解Android中Handler的實現(xiàn)原理

    這篇文章主要為大家詳細介紹了Android中Handler的實現(xiàn)原理,本文深入分析 Android 的消息處理機制,了解 Handler 的工作原理,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 一文徹底了解Android中的線程和線程池

    一文徹底了解Android中的線程和線程池

    眾所周知線程池能很高地提升程序的性能,下面這篇文章主要給大家介紹了關于Android中線程和線程池的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • Kotlin?Navigation可視化開發(fā)詳解

    Kotlin?Navigation可視化開發(fā)詳解

    Navigation?是?JetPack?中的一個組件,用于方便的實現(xiàn)頁面的導航,所以抽象出了一個?destination?的概念,大部分情況一個?destination?就表示一個?Fragment,但是它同樣可以指代?Activity、其它的導航圖
    2023-02-02
  • Android相機Camera基礎知識

    Android相機Camera基礎知識

    這篇文章主要為大家詳細介紹了Android相機Camera基礎知識,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android Studio下Flutter環(huán)境搭建圖文教程

    Android Studio下Flutter環(huán)境搭建圖文教程

    這篇文章主要為大家詳細介紹了Android Studio下Flutter環(huán)境搭建圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Android PopupWindow使用方法小結

    Android PopupWindow使用方法小結

    這篇文章主要為大家詳細介紹了Android PopupWindow使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論

宿松县| 会同县| 博客| 南靖县| 依安县| 枣庄市| 花垣县| 河北区| 林周县| 西华县| 楚雄市| 西林县| 南涧| 疏勒县| 姜堰市| 永福县| 浮山县| 延寿县| 石城县| 安顺市| 资阳市| 积石山| 昭苏县| 墨江| 鄂尔多斯市| 肥西县| 霍邱县| 鞍山市| 仙居县| 庆元县| 广西| 呼玛县| 云林县| 河东区| 黄梅县| 中江县| 南通市| 寿阳县| 娄底市| 安塞县| 鸡东县|