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

3 ответов


попробовать onScrollStateChanged Это решит вашу проблему


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

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

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

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