android - Get visible items in RecyclerView

ID : 10047

viewed : 26

Tags : androidandroid-recyclerviewandroid

Top 5 Answer for android - Get visible items in RecyclerView

vote vote

92

First / last visible child depends on the LayoutManager. If you are using LinearLayoutManager or GridLayoutManager, you can use

int findFirstVisibleItemPosition(); int findFirstCompletelyVisibleItemPosition(); int findLastVisibleItemPosition(); int findLastCompletelyVisibleItemPosition(); 

For example:

GridLayoutManager layoutManager = ((GridLayoutManager)mRecyclerView.getLayoutManager()); int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 

For LinearLayoutManager, first/last depends on the adapter ordering. Don't query children from RecyclerView; LayoutManager may prefer to layout more items than visible for caching.

vote vote

81

for those who have a logic to be implemented inside the RecyclerView adapter you can still use @ernesto approach combined with an on scrollListener to get what you want as the RecyclerView is consulted. Inside the adapter you will have something like this:

@Override     public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {         super.onAttachedToRecyclerView(recyclerView);         RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();         if(manager instanceof LinearLayoutManager && getItemCount() > 0) {             LinearLayoutManager llm = (LinearLayoutManager) manager;             recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {                 @Override                 public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {                     super.onScrollStateChanged(recyclerView, newState);                 }                  @Override                 public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {                     super.onScrolled(recyclerView, dx, dy);                         int visiblePosition = llm.findFirstCompletelyVisibleItemPosition();                         if(visiblePosition > -1) {                             View v = llm.findViewByPosition(visiblePosition);                             //do something                             v.setBackgroundColor(Color.parseColor("#777777"));                         }                 }             });         }     } 
vote vote

80

Finally, I found a solution to know if the current item is visible, from the onBindViewHolder event in the adapter.

The key is the method isViewPartiallyVisible from LayoutManager.

In your adapter, you can get the LayoutManager from the RecyclerView, which you get as parameter from the onAttachedToRecyclerView event.

vote vote

62

You can use recyclerView.getChildAt() to get each visible child, and setting some tag convertview.setTag(index) on these view in adapter code will help you to relate it with adapter data.

vote vote

54

Following Linear / Grid LayoutManager methods can be used to check which items are visible

int findFirstVisibleItemPosition(); int findLastVisibleItemPosition(); int findFirstCompletelyVisibleItemPosition(); int findLastCompletelyVisibleItemPosition(); 

and if you want to track is item visible on screen for some threshold then you can refer to the following blog.

https://proandroiddev.com/detecting-list-items-perceived-by-user-8f164dfb1d05

Top 3 video Explaining android - Get visible items in RecyclerView

Related QUESTION?