日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android RecyclerView 监听滑动

發布時間:2024/4/15 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android RecyclerView 监听滑动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天,簡單講講Android 如何監聽滑動。

?

不廢話了,主要是需要做一個功能,實現RecyclerView滑動時,讓一個標題欄固定顯示在頂部。

?

基本知識:

列表的滾動一般分為兩種:

  • 手指按下 -> 手指拖拽列表移動 -> 手指停止拖拽 -> 抬起手指

  • 手指按下 -> 手指快速拖拽后抬起手指 -> 列表繼續滾動 -> 停止滾動

  • 從上面可以看出,滾動狀態分為:

    |--靜止 |--滾動|--被迫拖拽移動|--自己滾動

    上面的過程的狀態變化如下:

  • 靜止 -> 被迫拖拽移動 -> 靜止

  • 靜止 -> 被迫拖拽移動 -> 自己滾動 -> 靜止

  • <!--more-->

    監聽RecyclerView的滾動

    好了,我們分析完滾動的過程,再看看如何監聽RecyclerView的滾動.查看源碼是最好的方法.

    看源碼

    查看RecyclerView的源碼,我們可以看到以下代碼:

    /*** Set a listener that will be notified of any changes in scroll state or position.* @param listener Listener to set or null to clear* @deprecated Use {@link #addOnScrollListener(OnScrollListener)} and* {@link #removeOnScrollListener(OnScrollListener)}*/ @Deprecated public void setOnScrollListener(OnScrollListener listener) {mScrollListener = listener; }/*** Add a listener that will be notified of any changes in scroll state or position.* <p>Components that add a listener should take care to remove it when finished.* Other components that take ownership of a view may call {@link #clearOnScrollListeners()}* to remove all attached listeners.</p>* @param listener listener to set or null to clear*/ public void addOnScrollListener(OnScrollListener listener) {if (mScrollListeners == null) {mScrollListeners = new ArrayList<>();}mScrollListeners.add(listener); }

    也就是說有兩種方式可以監聽滾動事件:

  • 其中 setOnScrollListener 已經過時(?設置的監聽器源碼如下:

    public abstract static class OnScrollListener {/*** Callback method to be invoked when RecyclerView's scroll state changes.* @param recyclerView The RecyclerView whose scroll state has changed.* @param newState The updated scroll state. One of {@link #SCROLL_STATE_IDLE},* {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}.*/public void onScrollStateChanged(RecyclerView recyclerView, int newState){}/*** Callback method to be invoked when the RecyclerView has been scrolled. This will be* called after the scroll has completed.* <p>* This callback will also be called if visible item range changes after a layout* calculation. In that case, dx and dy will be 0.** @param recyclerView The RecyclerView which scrolled.* @param dx The amount of horizontal scroll.* @param dy The amount of vertical scroll.*/public void onScrolled(RecyclerView recyclerView, int dx, int dy){} }

    在滾動過程中,此監聽器會回調兩個方法.

    onScrollStateChanged : 滾動狀態變化時回調
    onScrolled : 滾動時回調

    這兩者的區別在于:?狀態與過程

  • 舉例子

    注 : 以下源碼可在最后的地址中找到.

    demoRv = (RecyclerView) findViewById(R.id.demo_rv); layoutManager = new LinearLayoutManager(this); demoRv.setLayoutManager(layoutManager); demoRv.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));bookAdapter = new BookAdapter(); bookAdapter.fillList(MockService.getBookList()); demoRv.setAdapter(bookAdapter);demoRv.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);Log.i(TAG, "-----------onScrollStateChanged-----------");Log.i(TAG, "newState: " + newState);}@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);Log.i(TAG, "-----------onScrolled-----------");Log.i(TAG, "dx: " + dx);Log.i(TAG, "dy: " + dy);Log.i(TAG, "CHECK_SCROLL_UP: " + recyclerView.canScrollVertically(TAG_CHECK_SCROLL_UP));Log.i(TAG, "CHECK_SCROLL_DOWN: " + recyclerView.canScrollVertically(TAG_CHECK_SCROLL_DOWN));} });

    以上代碼中輸出了主要個幾個信息:

  • newState : 目前的狀態

  • dx : 水平滾動距離

  • dy : 垂直滾動距離

  • onScrollStateChanged 方法

  • recyclerView : 當前在滾動的RecyclerView

  • newState : 當前滾動狀態.

  • 其中newState有三種值:

    //停止滾動 public static final int SCROLL_STATE_IDLE = 0;//正在被外部拖拽,一般為用戶正在用手指滾動 public static final int SCROLL_STATE_DRAGGING = 1;//自動滾動開始 public static final int SCROLL_STATE_SETTLING = 2;

    onScrolled 方法

    • recyclerView : 當前滾動的view

    • dx : 水平滾動距離

    • dy : 垂直滾動距離

    真機實踐

    運行代碼

    運行以上代碼,然后按照上面的滾動過程分別進行兩種滾動.

    第一種方式緩慢滾動結果如下:

    I/MainActivity: -----------onScrollStateChanged----------- I/MainActivity: newState: 1 I/MainActivity: -----------onScrolled----------- I/MainActivity: dx: 0 I/MainActivity: dy: -6 I/MainActivity: CHECK_SCROLL_UP: true I/MainActivity: CHECK_SCROLL_DOWN: true ------------------------n個onScrolled-------------------- I/MainActivity: -----------onScrolled----------- I/MainActivity: dx: 0 I/MainActivity: dy: -2 I/MainActivity: CHECK_SCROLL_UP: true I/MainActivity: CHECK_SCROLL_DOWN: false I/MainActivity: -----------onScrollStateChanged----------- I/MainActivity: newState: 0

    第二種快速滾動結果如下:

    I/MainActivity: -----------onScrollStateChanged----------- I/MainActivity: newState: 1 I/MainActivity: -----------onScrolled----------- I/MainActivity: dx: 0 I/MainActivity: dy: 59 I/MainActivity: CHECK_SCROLL_UP: true I/MainActivity: CHECK_SCROLL_DOWN: true --------------------------n個onScrolled------------------- I/MainActivity: -----------onScrolled----------- I/MainActivity: dx: 0 I/MainActivity: dy: 54 I/MainActivity: CHECK_SCROLL_UP: true I/MainActivity: CHECK_SCROLL_DOWN: true I/MainActivity: -----------onScrollStateChanged----------- I/MainActivity: newState: 2 I/MainActivity: -----------onScrolled----------- I/MainActivity: dx: 0 I/MainActivity: dy: 56 I/MainActivity: CHECK_SCROLL_UP: true I/MainActivity: CHECK_SCROLL_DOWN: true --------------------------n個onScrolled------------------- I/MainActivity: -----------onScrolled----------- I/MainActivity: dx: 0 I/MainActivity: dy: 14 I/MainActivity: CHECK_SCROLL_UP: true I/MainActivity: CHECK_SCROLL_DOWN: true I/MainActivity: -----------onScrolled----------- I/MainActivity: dx: 0 I/MainActivity: dy: 1 I/MainActivity: CHECK_SCROLL_UP: true I/MainActivity: CHECK_SCROLL_DOWN: true I/MainActivity: -----------onScrollStateChanged----------- I/MainActivity: newState: 0

    分析結果

    且在滾動過程中發現:

    1.滾動方向

    dy > 0 時為向上滾動
    dy < 0 時為向下滾動

    2.回調過程

    緩慢拖拽回調過程:

    1. newState = RecyclerView.SCROLL_STATE_DRAGGING; 2. dy 多次改變 3. newState = RecyclerView.SCROLL_STATE_IDLE

    快速滾動回調過程:

    1. newState = RecyclerView.SCROLL_STATE_DRAGGING; 2. dy 多次改變 3. newState = RecyclerView.SCROLL_STATE_SETTLING; 4. dy 多次改變 5. newState = RecyclerView.SCROLL_STATE_IDLE;

    3.頂端與底部

    以上信息中還打印了

    RecyclerView.canScrollVertically(-1)的值表示是否滾動到頂部

    ?

    這些是基本知識,參考文章:https://www.cnblogs.com/ldq2016/p/6645952.html

    ?

    具體實現:

    在界面上設置一個標題欄,在RecyclerView 中的一個item和標題欄一致,當RecyclerView滑動到標題欄時,顯示界面上的標題欄,小于位置時,隱藏界面上的標題欄。我這個RecyclerView 的標題欄是第2個item。

    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);}@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);int firstItemPosition = linearLayoutManager.findFirstVisibleItemPosition();Log.e("TAG", " PersonalHomepageActivity " + firstItemPosition);if (firstItemPosition >= 1 && llBookTitle.getVisibility() == View.GONE) {llBookTitle.setVisibility(View.VISIBLE);} else if (firstItemPosition == 0 && llBookTitle.getVisibility() == View.VISIBLE) {llBookTitle.setVisibility(View.GONE);}}});

    ?

    Android RecyclerView 監聽滑動就講完了。

    ?

    就這么簡單。

    總結

    以上是生活随笔為你收集整理的Android RecyclerView 监听滑动的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。