0

我看到一個問題,RecyclerView在Nexus 6P API 25 7.1.1模擬器上不一致地激活SwipeRefreshLayout。 我們都在支持庫的最新版本:SwipeRefreshLayout停止工作/ RecyclerView不一致觸發SwipeRefreshLayout

compile 'com.android.support:recyclerview-v7:25.3.1' 
compile 'com.android.support:appcompat-v7:25.3.1' 
compile 'com.android.support:design:25.3.1' 
compile 'com.android.support:support-v4:25.3.1' 

我有與被前綴時刷新拉動發生(添加項目到頂部)一個數據集RecyclerView,它在我的佈局被聲明像這樣:

<android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/swipeRefresh" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"> 
     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recyclerView" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" /> 
</android.support.v4.widget.SwipeRefreshLayout> 

我能夠觸發該姿勢約2-3倍,將項目添加到RecyclerView但隨後不再允許我來觸發拉刷新。我們從來沒有調用SwipeRefreshLayout.setEnabled(false)。看起來RecyclerView在內部對canScrollVertically(-1)的響應是真的,儘管我們位於項目列表的頂部。

我們處理的唯一有趣的事情是我們覆蓋了RecyclerView的佈局管理器,讓我們滾動至下:

LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
llm.setStackFromEnd(true); // Start with most recent messages (enables scroll-to-bottom) 
recyclerView.setLayoutManager(llm); 

回答

0

View,其計算canScrollVertically(-1)代碼取決於computeVerticalScrollOffsetcomputeVerticalScrollRange結果和computeVerticalScrollExtent

RecyclerView依賴於LinearLayoutManager做這些計算。如果smoothScrollbarEnabledtrue(默認值)以顯示花哨的滾動條,則轉發至ScrollbarHelper,該值爲。

如果RecyclerView中的項目大小各不相同,則這些近似值將是完全錯誤的。

LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
llm.setSmoothScrollbarEnabled(false); 
recyclerView.setLayoutManager(llm); 

解決我們的問題,並得到了SwipeRefreshLayout每一個我們到了列表的頂部時可靠地觸發。

相關問題