1. 程式人生 > >糾正:Android RecyclerView滾動到指定位置並置頂(滾動方法、移動置頂、定位滑動到指定位置item)

糾正:Android RecyclerView滾動到指定位置並置頂(滾動方法、移動置頂、定位滑動到指定位置item)

最近博主發現讓RecyclerView滑動到某一位置並置頂的部落格一大堆,抄的是完全一模一樣。此外,雖然這些部落格“解決”了這些問題,但這種解決方案過於淺顯、粗暴,甚至都違背了開發思想。遂在此糾正這種錯誤。

RecyclerView提供了幾種移動的方法

scrollToPosition

scrollTo

scrollBy

smoothScrollBy

smoothScrollToPosition

雖然裡面有移動到指定位置的方法scrollToPosition(直接閃現至某一位位置)、smoothScrollToPosition(慣性滑動至某一位置)但是貌似都不盡人意,因為他們只保證能夠展示出來,並不能保證在第一位。而此時如果你開啟原始碼就會發現,原來全都是呼叫的LayoutManager移動方法,首先開啟我們耳熟能詳的LinearLayoutManager驚喜就在眼前

scrollToPosition

在scrollToPosition旁邊有木有一個很像的方法

    @Override
    public void scrollToPosition(int position) {
        mPendingScrollPosition = position;
        mPendingScrollPositionOffset = INVALID_OFFSET;
        if (mPendingSavedState != null) {
            mPendingSavedState.invalidateAnchor();
        }
        requestLayout();
    }
    public void scrollToPositionWithOffset(int position, int offset) {
        mPendingScrollPosition = position;
        mPendingScrollPositionOffset = offset;
        if (mPendingSavedState != null) {
            mPendingSavedState.invalidateAnchor();
        }
        requestLayout();
    }

當看到offset時也許就會明白:沒錯,這個就是item移動後相對父控制元件的偏移值,傳入0就會有你想要的

smoothScrollToPosition


    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
            int position) {
        LinearSmoothScroller linearSmoothScroller =
                new LinearSmoothScroller(recyclerView.getContext());
        linearSmoothScroller.setTargetPosition(position);
        startSmoothScroll(linearSmoothScroller);
    }

而smoothScrollToPosition原來僅僅是new了一個LinearSmoothScroller然後呼叫startSmoothScroll

我們只需要自定義一個LinearSmoothScroller,之前寫的有點倉促,仔細看LinearSmoothScroller的原始碼發現,其實谷歌已經埋下了伏筆,既然糾正就糾正到底吧

public class TopSmoothScroller extends LinearSmoothScroller {
    TopSmoothScroller(Context context) {
        super(context);
    }
    @Override
    protected int getHorizontalSnapPreference() {
        return SNAP_TO_START;//具體見原始碼註釋
    }
    @Override
    protected int getVerticalSnapPreference() {
        return SNAP_TO_START;//具體見原始碼註釋
    }
}

 然後呼叫LinearLayoutManager的startSmoothScroll即可

                    final TopSmoothScroller mScroller = new TopSmoothScroller(getActivity());
                    mScroller.setTargetPosition(integer);
                    mManager.startSmoothScroll(mScroller);

是否恍然大悟:其實我們並不需要什麼bd,也不需要修改LinearLayoutManager,僅僅需要幾行程式碼即可解決。

多看看原始碼,多思考思考,你也可以。

真理往往掌握在少數人手中,你是不是其中一員呢?

相關推薦

糾正Android RecyclerView滾動指定位置滾動方法移動定位滑動指定位置item

最近博主發現讓RecyclerView滑動到某一位置並置頂的部落格一大堆,抄的是完全一模一樣。此外,雖然這些部落格“解決”了這些問題,但這種解決方案過於淺顯、粗暴,甚至都違背了開發思想。遂在此糾正這種錯誤。 RecyclerView提供了幾種移動的方法 scrollToP

糾正Android Attempt to write to field 'int android.support.v7.widget.RecyclerView$ViewHolder...

最近發現recyclerview的一個異常,其他部落格寫的錯的亂七八糟,在此糾正一下這個異常: Attempt to write to field 'int android.support.v7.widget.RecyclerView$ViewHolder.mItemVi

Android自定義ImageView展示大圖中的指定區域切圓角雪碧圖

@Override protected void onDraw(Canvas canvas) { Drawable drawable = getDrawable(); if (drawable instanceof BitmapDrawable)

Android RecyclerView ItemDecoration時間軸線首尾部分顯示

package zhangphil.book; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Pain

總結C語言字串輸入的三種方式scanf("%c",array); scanf("%s",str); gets(array);

1、以scanf("%c",&array);的格式輸入字串; 由於%c是輸入一個字元,若需要輸入字串時我們可以建立陣列或指標配合迴圈(while,do{}while,for)來達到目的。如下例利用do{}while及陣列來輸入字串,並重新輸出,以字元#為結束標誌: #includ

tensorflow實戰端到端簡單粗暴識別驗證碼反爬利器OA信用盤平臺可殺大賠小

今天分享一OA信用盤平臺可殺大賠小(殺豬)QQ2952777280【話仙原始碼論壇】hxforum.com下如何簡單粗暴的解決驗證碼的辦法背景:對於一個爬蟲開發者來說,反爬蟲無疑是一個又愛又恨的對手,兩者之間通過鍵盤的鬥爭更是一個沒有硝煙的戰場。反爬蟲有很多措施,在這裡說說驗證碼這一塊論爬蟲修養:大家都是混口

Android Studio匯入github優秀開源專案SlidingMenu簡單方法

在app 的build.gradel裡面新增 repositories { maven { url "http://jzaccone.github.io/SlidingMenu-aar" } ... } dependencies { compile 'c

Android元件化之不同模組間 互動activity互相跳轉,資料互相傳遞,互相呼叫函式

 轉載請標明地址:https://blog.csdn.net/gaolei1201/article/details/77601027 在元件化之前,業務發展不是很快的時候,這樣是比較合適的,能一定程度地保證開發效率。 慢慢地程式碼量多了起來,開發人員也多了起來,業務發展也

全面解密QQ紅包技術方案架構技術實現移動端優化創新玩法等

本文來自騰訊QQ技術團隊工程師許靈鋒、周海發的技術分享。 一、引言 自 2015 年春節以來,QQ 春節紅包經歷了企業紅包(2015 年)、刷一刷紅包(2016 年)和 AR 紅包(2017 年)幾個階段,通過不斷創新玩法,活躍度節節攀升,成為春節一大玩點,給火紅的春節帶來一抹亮色。2017

android usb otg模式轉換成host模式不使用otg線連線,只用普通usb四線連線

把usb otg轉換成host接U盤。 開始除錯時,以為只要把OTG的配置去掉,即CONFIG_USB_MS_OTG遮蔽掉即可,但編譯燒錄後,插入和撥出U盤時發現提示 android_work: did not send uevent (0 0 (null)) U盤的燈也不亮,說明沒有上電。 後來搜

android 自定義View之View的測量onMeasure()方法

       在自定義控制元件的過程中,系統在繪製View前,必須對View進行測量,已使後面的onLayout(設定View的放置位置)能夠順利進行。而對VIew的測量的過程則是在onMeasure()中進行的。可能這時有的同學就發現問題了,說,自己以前自定義的View沒

Android中獲取屏幕相關信息屏幕大小,狀態欄標題欄高度的代碼

status tle efault android中 () 兩個 statusbar create eight 如下代碼內容是關於 Android中獲取屏幕相關信息(屏幕大小,狀態欄、標題欄高度)的代碼。 DisplayMetrics metrics = new Displ

Mybaits 原始碼解析 ----- 全網最詳細Select 語句的執行過程分析上篇Mapper方法是如何呼叫到XML中的SQL的?

上一篇我們分析了Mapper介面代理類的生成,本篇接著分析是如何呼叫到XML中的SQL 我們回顧一下MapperMethod 的execute方法 public Object execute(SqlSession sqlSession, Object[] args) { Object res

Android RecyclerView 滾動到中間位置

最近看到QQ音樂的歌詞每次滑動後都可以滾回到中間位置。覺得甚是神奇,開啟開發者模式顯示佈局,發現歌詞部分不是採用 android 控制元件的寫的,應該是前端寫的。於是,我想,能不能用 recyclerView 實現這個自動回滾到中間位置呢。功夫不負有心人,查找了一些資料之後,終於搞定了。下面由我細細講來。目標

RecyclerView 滾動指定position,

今天寫頁面有一個需求是這樣的: 有一個廣告條,顯示2條廣告資訊並且,可以自動向上滾動。what? 2條看得我懵逼,一般我們看到的廣告條都是一條一條切換,使用ViewFlipper就能夠實現,但ViewFlipper不能顯示2條。苦思冥想下,覺得使用Recycl

Android RecyclerView滾動定位item使其

/**準確定位到指定位置,並且將指定位置的item置頂, 若直接呼叫scrollToPosition(...)方法,則不會置頂。**/

Android RecyclerView +SnapHelper 實現橫向滾動自動滾動到中心控制元件選中

效果圖 此效果已被產品砍掉,所以有些適配bug就不修改了 此部落格只為記錄下程式碼 默哀3秒 1秒 2秒 3秒 程式碼 佈局檔案 <?xml version="1.0" encoding="utf-8"?> <

android介面開發ViewPager的詳解,用於仿微博滑動例項和圖片滾動例項

1.ViewPager簡單使用 ViewPager是android擴充套件包android.support.v4 裡的一個繼承與ViewGroup元件,通過佈局管理器可以實現左右滑動來顯示不同的View。而這個View由PagerAdapter產生,用法類似於

Android RecyclerView:設定指定位置的兩種方法

方法一,直接使用當前的manager /* RecyclerView 移動到當前位置, * * @param manager 設定RecyclerView對應的manager

Android 相機拍照獲取圖片儲存到指定位置

public void takePhone(View view) { if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXT