Android - обнаружение, когда отображается последний элемент в RecyclerView

У меня есть метод, который проверяет, является ли последний элемент в RecyclerView полностью видимым пользователем, пока у меня есть этот код Проблема в том, как проверить, достигло ли 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);
    }
}

ОБНОВЛЕНИЕ: Это одна из попыток, которые я пробовал

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();

Ответ 1

попробуйте работать с onScrollStateChanged он решит вашу проблему.

Ответ 2

Вы можете создать обратный вызов в своем адаптере, который будет отправлять сообщение вашей активности/фрагменту каждый раз, когда отображается последний элемент.

Например, вы можете реализовать эту идею в методе 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 
}

ОБНОВИТЬ

Ну, я знаю, что это было какое-то время, но сегодня я столкнулся с той же проблемой, и я придумал решение, которое прекрасно работает. Итак, я просто оставлю это здесь, если кому-нибудь это понадобится:

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
        }
    }
});

Ответ 3

Предполагая, что вы используете LinearLayoutManager, этот метод должен сделать трюк:

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