糾正: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