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();
essayez de travailler avec onScrollStateChanged
cela résoudra votre problème
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
}
}
});
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);
}
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.