RecycleView內部沒有幫我們實現ScrollTo的方法,不過幫我們實現了ScrollBy,我們可以通過ScrollBy自定義一個支持scrollTo的RecycleView。 ...
RecycleView內部沒有幫我們實現ScrollTo的方法,不過幫我們實現了ScrollBy,我們可以通過ScrollBy自定義一個支持scrollTo的RecycleView。
public class ScrollToRecyclerView extends RecyclerView { //記錄滾動的總距離,類似view中的mScrollX和mScrollY private int sx = 0, sy = 0; //自己定義的滾動監聽介面 public interface RecyclerScrollChangeListener{ void ScrollChange(int y); } private RecyclerScrollChangeListener mScrollListener = null; public ScrollToRecyclerView(Context context) { super(context); addScrollListener(); } public ScrollToRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); addScrollListener(); } public ScrollToRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); addScrollListener(); } //重寫scrollTo方法,通過內部的scrollBy實現scrollTo的功能 @Override public void scrollTo(int x, int y) { super.scrollTo(x, y); //計算滾動的相對距離,通過傳進來的x和當前的sx差值就是scrollBy需要滾動的值 scrollBy(x - sx, y - sy); } //添加view的scrolllistener,在view滾動時根據滾動的距離自己計算sx,sy private void addScrollListener(){ addOnScrollListener(new OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { // oldsx = sx; // oldsy = sy //因為dx和dy是相對上次的滾動距離,所以通過一開始的累加可以得到總的sx和sy sx += dx; sy += dy; super.onScrolled(recyclerView, dx, dy); //此處如果有需要監聽滾動變化的話在這回調 if(mScrollListener != null){ mScrollListener.ScrollChange(sy); } } }); } //設置監聽 public void setRecyclerScrollListener(RecyclerScrollChangeListener scrollListener) { this.mScrollListener = scrollListener; } }