RecyclerView帚称,你為什么不回調(diào) onScrolled 方法了?

RecyclerView

這個控件帶來的插件化編程體驗良好的性能都在不斷吸引大家使用 ta秽澳,github 上已經(jīng)有很多基于 RecyclerView 的開源項目闯睹,并且為 RecyclerView 增加了很多牛逼的 feature。這次担神,我也實現(xiàn)了一個自己的 RecyclerView楼吃。

feature-1 滑動到底部加載更多

其實,實現(xiàn) LoadMore 功能并不難,網(wǎng)上也一堆分享孩锡,這里我主要參考了秋百萬的 cube-sdk 中的 recycler-load-more 分支酷宵。

我的疑惑

實現(xiàn)后的效果.gif

當 RecyclerView 中只有一條數(shù)據(jù)時,無論我怎么 scroll(滾動)躬窜,OnScrollListener 里 onScrolled(RecyclerView recyclerView, int dx, int dy) 這個重要的回調(diào)方法 似乎是被誰吃掉了一樣浇垦,再也沒有被觸發(fā)了,這是為什么荣挨?

不科學男韧,斷點調(diào)試大法啟動

同事帶我深入了 RecyclerView 源碼尋找這個方法被吃掉的原因。

// 省略在源碼中的艱辛尋找過程...

最后默垄,定位到了 LinearLayoutManager 里的這個方法

int scrollBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
        if (getChildCount() == 0 || dy == 0) {
            return 0;
        }
        mLayoutState.mRecycle = true;
        ensureLayoutState();
        final int layoutDirection = dy > 0 ? LayoutState.LAYOUT_END : LayoutState.LAYOUT_START;
        final int absDy = Math.abs(dy);
        updateLayoutState(layoutDirection, absDy, true, state);
        final int freeScroll = mLayoutState.mScrollingOffset;
        final int consumed = freeScroll + fill(recycler, mLayoutState, state, false);
        if (consumed < 0) {
            if (DEBUG) {
                // 沒有更多元素可以 scroll 4寺恰!口锭!
                Log.d(TAG, "Don't have any more elements to scroll");
            }
            return 0;
        }
        final int scrolled = absDy > consumed ? layoutDirection * consumed : dy;
        mOrientationHelper.offsetChildren(-scrolled);
        if (DEBUG) {
            Log.d(TAG, "scroll req: " + dy + " scrolled: " + scrolled);
        }
        mLayoutState.mLastScrollDelta = scrolled;
        return scrolled;
    }

分析

看到這里朦前,已經(jīng)清楚很多了,注釋里已經(jīng)說明鹃操,consumed < 0 表明沒有更多元素可以滾動(其實已經(jīng)被內(nèi)部消化了)韭寸。在這種情況下,onScrolled(RecyclerView recyclerView, int dx, int dy) 是不會被調(diào)用的组民!那什么情況下算是沒有更多元素可以滾動呢棒仍?

做個實驗好咯

刷新時加載的數(shù)據(jù)分別設置為 1、2臭胜、3 條,在 logcat 觀察onScrolled(RecyclerView recyclerView, int dx, int dy) 是否被調(diào)用癞尚。

  1. 當屏幕中的 item 數(shù)量多到超出屏幕的時候耸三,這時候的滾動是會觸發(fā) onScrolled(RecyclerView recyclerView, int dx, int dy) 方法的。

  2. 屏幕中的 item 完全顯示在屏幕中時浇揩,onScrolled(RecyclerView recyclerView, int dx, int dy) 是不會被觸發(fā)的仪壮。

附上 HVEndlessRecyclerView 地址

寫在最后

簡詩
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胳徽,隨后出現(xiàn)的幾起案子积锅,更是在濱河造成了極大的恐慌,老刑警劉巖养盗,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缚陷,死亡現(xiàn)場離奇詭異,居然都是意外死亡往核,警方通過查閱死者的電腦和手機箫爷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人虎锚,你說我怎么就攤上這事硫痰。” “怎么了窜护?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵效斑,是天一觀的道長。 經(jīng)常有香客問我柱徙,道長缓屠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任坐搔,我火速辦了婚禮藏研,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘概行。我一直安慰自己蠢挡,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布凳忙。 她就那樣靜靜地躺著业踏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涧卵。 梳的紋絲不亂的頭發(fā)上勤家,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音柳恐,去河邊找鬼伐脖。 笑死,一個胖子當著我的面吹牛乐设,可吹牛的內(nèi)容都是我干的讼庇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼近尚,長吁一口氣:“原來是場噩夢啊……” “哼蠕啄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戈锻,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤歼跟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后格遭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哈街,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年如庭,在試婚紗的時候發(fā)現(xiàn)自己被綠了叹卷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撼港。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骤竹,靈堂內(nèi)的尸體忽然破棺而出帝牡,到底是詐尸還是另有隱情,我是刑警寧澤蒙揣,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布靶溜,位于F島的核電站,受9級特大地震影響懒震,放射性物質(zhì)發(fā)生泄漏罩息。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一个扰、第九天 我趴在偏房一處隱蔽的房頂上張望瓷炮。 院中可真熱鬧,春花似錦递宅、人聲如沸娘香。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烘绽。三九已至,卻和暖如春俐填,著一層夾襖步出監(jiān)牢的瞬間安接,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工英融, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盏檐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓驶悟,卻偏偏與公主長得像糯笙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撩银,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 簡介: 提供一個讓有限的窗口變成一個大數(shù)據(jù)集的靈活視圖。 術(shù)語表: Adapter:RecyclerView的子類...
    酷泡泡閱讀 5,170評論 0 16
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評論 25 707
  • 這篇文章分三個部分豺憔,簡單跟大家講一下 RecyclerView 的常用方法與奇葩用法额获;工作原理與ListView比...
    LucasAdam閱讀 4,391評論 0 27
  • 人一生中最難寫的作文是什么?答案也許就是“遺囑”了恭应。一段日子之前抄邀,我在視頻上看到一位女士。正當壯年昼榛,不幸喪夫境肾。懷著...
    曉天狼星閱讀 405評論 3 4
  • 霓虹燈 夜的 眼睛 在空寂的城市里 踽踽獨行 藍色的夢 漂浮 像一株無助的樹 搖動清瘦的身影 虛擬...
    大唐逸民閱讀 136評論 0 4