一行程式碼搞定使用LinearLayoutManager一鍵返回頂部

dav2100發表於2021-09-09

之前在學習RecyclerView的時候,建立了一個可以滑動的View列表,但是當滑動距離過長的時候,需要手動返回到頂部,於是加了一個一鍵返回頂部的按鈕。

圖片描述

效果圖

要實現這種效果,有兩點需要實現:

1、控制LanyoutManager滑動距離,根據滑動狀態(距離)改變去設定隱藏或者顯示。
2、設定top的點選事件,點選回到頂部。

很遺憾LayoutManager只提供給了我們獲取第一個可見item的高度的方法,而這裡我們需要獲取的是從開始到現在滑動的總距離,所以不得不動手去自己寫,網上也有很多方法,試了一通還是這個比較好用。

建議如果對RecyclerView還不是太熟悉的可以試試他的一些獲取高度的方法,
getChildAt()getHeight(),來看一下效果,
關於index,可以透過findFirstVisibleItemPosition();獲取,
剛開始很天真的以為官方會提供有方法,然而進方法原始碼去看並沒有,如果各位同行有更好的方法歡迎留言。

  public int getScollYDistance() {        int position = layoutManager.findFirstVisibleItemPosition();
        View firstVisiableChildView = layoutManager.findViewByPosition(position);        int firstVisiableChildViewTop = firstVisiableChildView.getTop();        int itemHeight = firstVisiableChildView.getHeight();        //可見的item的index*item高度-最頂端位置
        return (position) * itemHeight - firstVisiableChildViewTop;
    }

獲取高度之後
我們需要獲取高度,設定效果
可以diy各種效果,常見的效果比如支付寶開始滑動的時候,title會漸變最後慢慢隱藏換成其他功能。都在這個方法裡實現

如果只需要我們做返回頂部的效果,那麼直接在這裡設定距離就行了,這個距離就是滑動的總距離,當滑動距離超過400的時候設定按鈕可見,小於400的時候隱藏掉。

    public void selectItem() {             
        //彈出top返回頂部按鈕
        if (getScollYDistance()>=400){
            backTop.setVisibility(View.VISIBLE);
        }else {
            backTop.setVisibility(View.GONE);
        }

    }

當然這只是最簡單的樣式,要複雜的一點的話可以這樣:
在滑動中改變效果,或者設定漸變效果

if (getScollYDistance() <= 0) {          
            float scale = (float) getScollYDistance() / 400;            float alpha = (255 * scale);            // 只是layout背景透明(仿知乎滑動效果)
            tvTitle.setBackgroundColor(Color.argb((int) alpha, 254, 184, 6));
        } else {//            tvTitle.setBackgroundColor(Color.argb((int) 0, 254, 184, 6));
            tvTitle.setVisibility(View.GONE);
        }

等等,自己想要什麼樣的效果,在這裡面設定就行。

然後只需要我們在滑動事件中新增效果。

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {                super.onScrolled(recyclerView, dx, dy);

                selectItem();
}

最後不要忘了設定返回按鈕的監聽事件

只一行程式碼scrollToPosition(0);每次點選讓其返回初始位置即可完成一鍵返回到頂部的操作。

        backTop.setOnClickListener(new View.OnClickListener() {            @Override
            public void onClick(View v) {
                recyclerView.scrollToPosition(0);
            }
        });

附上xml:

 <RelativeLayout
     android:id="@+id/view_relat"
     android:layout_width="match_parent"
     android:layout_height="match_parent"><android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipeRefreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"><android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:dividerHeight="2dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/></android.support.v4.widget.SwipeRefreshLayout>
  <RelativeLayout
      android:layout_width="80dp"
      android:layout_height="80dp"
      android:layout_alignParentBottom="true"
      android:layout_alignParentEnd="true">
    <ImageView
        android:id="@+id/back_top"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="@drawable/back_top_icon"
        android:visibility="gone"/>
  </RelativeLayout>
 </RelativeLayout>



作者:八怪不姓醜
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4479/viewspace-2818183/,如需轉載,請註明出處,否則將追究法律責任。

相關文章