Android - 检测RecyclerView中的最后一个项目是否可见

问题描述:

我有一个方法可以检查RecyclerView中的最后一个元素是否完全由用户看到,到目前为止我有这个代码 问题是如何检查RecyclerView已经达到了底部?Android - 检测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); 
    } 
} 

UPDATE:这是我尝试

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

什么是你的问题? – Real73

+0

@ Real73我不知道该怎么做! –

+0

[在RecyclerView中获取可见项目]的可能重复(http://*.com/questions/24989218/get-visible-items-in-recyclerview) – Acapulco

尝试onScrollStateChenged工作将解决您的问题

假设你正在使用LinearLayoutManager,这种方法应该做的伎俩:

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

这正是我想要的但是我有一个NullPointerException,游标显示我这一行:'int numItems = mRecyclerView.getAdapter()。getItemCount();' –

+0

创建适配器时,将其设置为某个字段(mAdapter),并使用该字段'int numItems = mAdapter.getItemCount();' – marmor

+0

这没有奏效,我不确定是否我的解释是正确的,但是,这就是我基本上做了int intItems = mAdapter.getItemCount();'改正我如果我错了 –

您可以创建在适配器中的回调,将每次发送邮件到您的活动/片段时的最后一个项目是可见。

例如,你可以实现这个想法在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 
} 

UPDATE

嗯,我知道它已经有一段时间,但今天我碰到了同样的问题,我想出了用完美的解决方案。所以,我就离开这里,如果有人曾经需要它:

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

您能否进一步详细解释代码? –

+0

只有当物品被回收时才能使用...如果物品只有两三个,onBindViewHolder只在第一次显示物品时调用一次,这意味着每个物品的位置检查只有一次。 如果我们需要在滚动时动态更改items/recyclerview之外的内容,它将在第一时间继续工作。 CMIIW – hayi