簡體   English   中英

如何讓 RecyclerView 平滑滾動?

[英]How to make RecyclerView scroll smoothly?

這更像是一個通用問題,但經過大量搜索和嘗試后,我無法理解為什么這很難實現。 是我能找到但仍然無法實施的最接近的答案。

具體來說,我將 RecyclerView 與 GridLayoutManager 一起使用。 我想要的是平滑滾動的網格布局(就像默認的畫廊應用程序),沒什么特別的,但是網格布局管理器的默認實現以“生澀”的方式滾動視圖。 我試圖從上面的鏈接中實現該方法,但沒有成功。

我也嘗試實現 LinearSmoothScroller 但我不確定如何實現 computeScrollVectorForPosition 方法。 谷歌關於 computeScrollVectorForPosition 的文檔字面上有 0 個字。

我找到了 這個 3 部分教程,但它的幫助很小。 所以,我想問的是:是否有某種模板代碼可以在 LinearSmoothScroller 中實現,或者通過擴展 RecyclerView.SmoothScroller 來實現平滑滾動? 即使代碼取決於 gridlayout 中每行的項目數和項目數,也必須有一些方法可以輕松完成。 我在這里錯過了什么嗎?

Android 中“生澀”滾動的典型原因是應用程序在主應用程序線程更新 UI 上花費了太多時間。 RecyclerView的情況下,這意味着在onBindViewHolder()或可能在onCreateViewHolder()花費太多時間。 每個都需要在亞毫秒內返回,這意味着您不能在其中執行磁盤 I/O 或網絡 I/O。

想我發現了問題。 我正在使用 holder.photo.setImageBitmap(BitmapFactory.decodeFile(itemList.get(position).get‌ AbsolutePath())); 在 onBindViewHolder() 上,圖像文件每個大約 100kb,列表中有大約 12 個圖像

是的,這將在主應用程序線程上進行磁盤 I/O 和圖像解碼。 這將慢到足以導致 UI 卡頓(即“生澀”滾動)。

考慮使用圖像加載庫,例如 Picasso 或 Universal Image Loader,因為它們可以異步地從位圖填充ImageView

此示例應用程序使用 Universal Image Loader 來幫助填充RecyclerView (使用GridLayoutManager )的內容,數據源是設備上的可用視頻。

ActivityFragment聲明RecyclerView任何位置添加此內容

RecyclerView mRecyclerview = (RecyclerView) findViewById(...);
mRecyclerview.setNestedScrollingEnabled(false);

setNestedScrollview(false)為您完成工作。

我剛遇到這個問題,禁用嵌套滾動修復了它。 像這樣做:

yourRecyclerview.setNestedScrollingEnabled(false);

或者您可以更改您定義 RecyclerView 的 xml 文件中的值:

<android.support.v7.widget.RecyclerView
    android:id="@+id/yourRecyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:nestedScrollingEnabled="false"/>

我剛遇到這個問題,我把RecyclerView放在ScrollView所以請不要把RecyclerView放在ScrollView ,這也可能導致。

mLayoutManager.findFirstVisibleItemPosition()

那總是返回一個固定值。 還要檢查

recyclerview.setNestedScrollingEnabled(false);

我通過覆蓋calculateSpeedPerPixel(DisplayMetrics displayMetrics)方法使滾動變得平滑:

public class CustomLayoutManager extends LinearLayoutManager {

    protected CenterLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

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

    private class CenterSmoothScroller extends LinearSmoothScroller {

        CenterSmoothScroller(Context context) {
            super(context);
        }

        @Override
        public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
            return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2);
        }

        @Override
        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
            return 0.5f; //pass as per your requirement
        }
    }
}
android:animateLayoutChanges="false"

您需要使用“Picasso”庫異步加載圖像,並使用fit()函數確保您加載的圖像的大小與布局中的圖像視圖的大小相似。 此外,如果您在滾動視圖中使用回收器視圖,請確保將nested scrolling設置為 false。

我使用上述三種方法解決了我的問題

使用此處其他評論所述的庫。 還要確保您沒有將 Recyclerviews 嵌套在 Scrollview 中。 這也是我之前不太順利的原因之一。

在其中度過3 天后,我解決了項目中的平滑滾動問題。

問題是在item_user.xml文件的背景中設置了<layer-list> drawable,因此渲染需要GPU 時間,這就是滾動不流暢的原因。

不要在適配器項中使用<layer-list>或任何其他復雜的 drawable。

只需添加這個

animateLayoutChanges = true 

在recyclerview xml

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM