2016-02-09 27 views
5

我有一個RecyclerView即時通訊試圖實現無限滾動功能。問題是,OnScrolled方法中if語句內的代碼正在執行兩次。繼承人我當前的代碼:RecyclerView無限滾動監聽器被調用兩次

public abstract class InfiniteScroll extends RecyclerView.OnScrollListener { 

private LinearLayoutManager mLayoutManager; 
private int previousTotal = 0; 
private boolean loading = true; 
private int visibleThreshold = 5; 
int firstVisibleItem, visibleItemCount, totalItemCount; 

private int current_page = 1; 

public InfiniteScroll(LinearLayoutManager layoutManager) { 
    mLayoutManager = layoutManager; 
} 

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

    visibleItemCount = recyclerView.getChildCount(); 
    totalItemCount = mLayoutManager.getItemCount(); 
    firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition(); 

    if (loading) { 
     if (totalItemCount > previousTotal) { 
      loading = false; 
      previousTotal = totalItemCount; 
     } 
    } 
    if (!loading && (totalItemCount - visibleItemCount) 
      <= (firstVisibleItem + visibleThreshold)) { 
     // End has been reached 

     // Do something 
     current_page++; 
     Log.d("moreitems", "why is this being called twice?"); 
     loadMore(current_page); 

     loading = true; 
    } 
} 

public abstract void loadMore(int current_page); 
} 

這段代碼被張貼作爲一個答案,一個單獨的SO問題,和其他例子似乎功能類似,但我仍然可以到達RecyclerView底部時loadMore()方法執行兩次,我不知道爲什麼。

+0

使用'LimearLayoutManager#findLast [完全] VisibleItemPosition()'方法 – pskink

回答

0

試試這個:

public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       super.onScrolled(recyclerView, dx, dy); 
       final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); 
       totalItemCount = linearLayoutManager.getItemCount(); 
       lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); 
       if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) { 
        loading = true; 
        // End has been reached 
        // Do something 
         current_page++; 
         Log.d("moreitems", "why is this being called twice?"); 
         loadMore(current_page); 

       } 
      } 
+0

你在哪裏設置加載回'false'這個解決方案?否則,加載保持「真」,並再次到達列表的末尾,不會觸發另一個加載。 – Orbit

+0

我已經在這裏發佈了示例代碼:http://stackoverflow.com/questions/35253695/recyclerview-load-more-with-progressbar-error/35254285#35254285 – Sabari

+0

Add loading = false;在loarmore()方法中(最後一行)。所有東西都完成後,您應該將裝載設爲假。 – Sabari

7

它獲取調用,因爲當你loadMore項目,onScrolled再次調用。

如果在佈局計算後可見項目範圍發生變化,則也會調用此回調函數。在這種情況下,dx和dy爲0。

,所以你可以檢查 if (!loading && dy>0) 以及

+1

謝謝,適合我! –

+2

順便說一句,我已經將它添加到'onScrolled'的開頭,所以什麼都不會執行,是否有一個原因與'!loading'一起使用?我發現它也可以使用'!loading',但是爲什麼要執行中間代碼,是否可以向上移動它:'if(dy <= 0)return;',我的意思是我沒有看到我的代碼有任何問題,但也許遇到一些罕見的情況? –

-1

我剛剛遇到類似的情況,而解決方案是從上面的回答完全不同。

在我的情況下,我有一個自定義的RecyclerViewFragment,它將在數據加載的東西開始時設置RecyclerView。我在該設置的方法塊中添加一個自定義的OnScrollListener。

我的原因爲什麼OnScrollListener被調用兩次,我無意中添加兩個OnScrollListener到我的RecyclerView。因此,這兩個監聽者都將傾聽「滾動到結束」動作併爲此做點事情。

所以我在調用設置方法之前只刪除了我的RecyclerView的所有OnScrollListener,以確保只有一個OnScrollListener。

希望得到這個幫助。

0
if (layoutManager.findLastCompletelyVisibleItemPosition() == 
recyclerAdapter.getItemCount() - 1) { 
    //load more items code is here 
} 

這將工作。