2016-11-21 78 views
4

我有一個方法可以檢查RecyclerView中的最後一個元素是否完全由用戶看到,到目前爲止我有這個代碼 問題是如何檢查RecyclerView已經達到了底部?Android - 檢測RecyclerView中的最後一個項目是否可見

PS我有一個項目分隔

public void scroll_btn_visibility_controller(){ 
    if(/**last item is visible to user*/){ 
     //This is the Bottom of the RecyclerView 
     Scroll_Top_Btn.setVisibility(View.VISIBLE); 
    } 
    else(/**last item is not visible to user*/){ 
     Scroll_Top_Btn.setVisibility(View.INVISIBLE); 
    } 
} 

UPDATE:這是我嘗試

boolean isLastVisible() { 
    LinearLayoutManager layoutManager = ((LinearLayoutManager)rv.getLayoutManager()); 
    int pos = layoutManager.findLastCompletelyVisibleItemPosition(); 
    int numItems = disp_adapter.getItemCount(); 
    return (pos >= numItems); 
} 
public void scroll_btn_visibility_controller(){ 

    if(isLastVisible()){ 
     Scroll_Top.setVisibility(View.VISIBLE); 
    } 
    else{ 
     Scroll_Top.setVisibility(View.INVISIBLE); 
    } 
} 

的嘗試之一到目前爲止,還沒有成功,我覺得有一些內部錯誤這些行:

int pos = layoutManager.findLastCompletelyVisibleItemPosition(); 
int numItems = disp_adapter.getItemCount(); 
+0

什麼是你的問題? – Real73

+0

@ Real73我不知道該怎麼做! –

+0

[在RecyclerView中獲取可見項目]的可能重複(http://stackoverflow.com/questions/24989218/get-visible-items-in-recyclerview) – Acapulco

回答

2

嘗試onScrollStateChenged工作將解決您的問題

2

假設你正在使用LinearLayoutManager,這種方法應該做的伎倆:

boolean isLastVisible() { 
    LinearLayoutManager layoutManager = ((LinearLayoutManager)mRecyclerView.getLayoutManager()); 
    int pos = layoutManager.findLastCompletelyVisibleItemPosition(); 
    int numItems = mRecyclerView.getAdapter().getItemCount(); 
    return (pos >= numItems); 
} 
+0

這正是我想要的但是我有一個NullPointerException,遊標顯示我這一行:'int numItems = mRecyclerView.getAdapter()。getItemCount();' –

+0

創建適配器時,將其設置爲某個字段(mAdapter),並使用該字段'int numItems = mAdapter.getItemCount();' – marmor

+0

這沒有奏效,我不確定是否我的解釋是正確的,但是,這就是我基本上做了int intItems = mAdapter.getItemCount();'改正我如果我錯了 –

9

您可以創建在適配器中的回調,將每次發送郵件到您的活動/片段時的最後一個項目是可見。

例如,你可以實現這個想法在onBindViewHolder方法

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
    if(position==(getItemCount()-1)){ 
     // here goes some code 
     // callback.sendMessage(Message); 
    } 
    //do the rest of your stuff 
} 

UPDATE

嗯,我知道它已經有一段時間,但今天我碰到了同樣的問題,我想出了用完美的解決方案。所以,我就離開這裏,如果有人曾經需要它:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       LinearLayoutManager layoutManager=LinearLayoutManager.class.cast(recyclerView.getLayoutManager()); 
       int totalItemCount = layoutManager.getItemCount(); 
       int lastVisible = layoutManager.findLastVisibleItemPosition(); 

       boolean endHasBeenReached = lastVisible + 5 >= totalItemCount; 
       if (totalItemCount > 0 && endHasBeenReached) { 
        //you have reached to the bottom of your recycler view 
       } 
      } 
     }); 
+0

您能否進一步詳細解釋代碼? –

+0

只有當物品被回收時才能使用...如果物品只有兩三個,onBindViewHolder只在第一次顯示物品時調用一次,這意味着每個物品的位置檢查只有一次。 如果我們需要在滾動時動態更改items/recyclerview之外的內容,它將在第一時間繼續工作。 CMIIW – hayi

相關問題