Android-检测RecyclerView中的最后一项何时可见

Android-检测RecyclerView中的最后一项何时可见,android,android-recyclerview,Android,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

我有一个方法,可以检查用户是否完全可以看到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();

假设您使用的是
LinearLayoutManager
,此方法应该可以实现以下功能:

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

您可以在适配器中创建回调,每当最后一项可见时,该回调将向您的活动/片段发送消息

例如,您可以在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
        }
    }
});

尝试使用
onScrollStateChanged
它将解决您的问题

您应该将代码与以下更改一起使用:

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

请小心,findLastCompletelyVisibleItemPosition()返回从0开始的位置。所以,你应该在numites之后减去1。

你有什么问题?@Real73我不知道怎么做!可能重复的可能重复再次重建后,应用程序不会崩溃,我也没有收到任何错误,但该方法不起作用,当我到达末尾时,可见性不会更改为
VISIBLE
print以记录您获得的
pos
numItems
的值,并尝试了解问题。另外,确保在适当的时间调用该方法。为了得到正确的结果,我必须将pos数增加1。否则为所有结果提供false.return(pos>=numItems-1);请参阅下面的答案。仅当物品回收时才工作。。。如果项目只有两个或三个,则当项目第一次显示时onBindViewHolder仅调用一次,这意味着每个项目的位置检查仅为一次。如果我们需要在滚动时动态更改items/recyclerview之外的内容,那么它在第一时间将不会起作用。CMIIW@nullbyte为什么
+5
?我也不明白+5@viper尝试调试。它将帮助您理解为什么它是5,为什么不是0。为什么在
布尔endHasBeenReached=lastVisible+5>=totalItemCount与以前的isLastVisible方法答案相比,这实际上是正确的isLastVisible方法。谢谢!这对我来说是最好最简单的解决方案。