web-dev-qa-db-fra.com

Android - Détecter quand le dernier élément de RecyclerView est visible

J'ai une méthode qui vérifie si le dernier élément de RecyclerView est complètement visible par l'utilisateur. Jusqu'à présent, j'ai ce code. Le problème est de savoir comment vérifier si RecyclerView a atteint son point bas.

PSJ'ai des séparateurs d'éléments

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: C'est l'une des tentatives que j'ai tentées

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

jusqu'à présent, aucun succès, je pense qu'il y a quelque chose qui cloche dans ces lignes:

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

essayez de travailler avec onScrollStateChanged cela résoudra votre problème

1
Anis Vikernes

Vous pouvez créer un rappel dans votre adaptateur qui enverra un message à votre activité/fragment chaque fois que le dernier élément est visible.

Par exemple, vous pouvez implémenter cette idée dans la méthode 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 
}

METTRE À JOUR

Eh bien, je sais que cela fait longtemps, mais aujourd’hui, j’ai rencontré le même problème et j’ai trouvé une solution qui fonctionne parfaitement. Donc, je vais le laisser ici si quelqu'un en a besoin:

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

En supposant que vous utilisez LinearLayoutManager, cette méthode devrait faire l'affaire:

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

Vous devez utiliser votre code avec les modifications suivantes:

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

Attention, findLastCompletelyVisibleItemPosition () renvoie la position qui commence à 0. Vous devez donc moins 1 après numItems.

1
user2294911