-1

I have a long itemView in RecyclerView adapter and what I want is a listener to check if a view in itemView is visible or not, while scrolling recyclerView. What I need is somthing like "onRecyclerViewScrolled()" in this example code:

    public class MyAdapter extends RecyclerView.Adapter<ViewHolder> {


    @Override
    public void onBindViewHolder(@NonNull final ViewHolder myViewHolder, int
            position) {

      onRecyclerViewScrolled() {
        if (!isVisible(myViewHolder.myView)) {
          //do something
        }
      }

    }

  }

  public static boolean isVisible(final View view) {
    if (view == null) {
      return false;
    }
    if (!view.isShown()) {
      return false;
    }
    final Rect actualPosition = new Rect();
    view.getGlobalVisibleRect(actualPosition);
    final Rect screen = new Rect(0, 0, getScreenWidth(), getScreenHeight());
    return actualPosition.intersect(screen);
  }

  public static int getScreenWidth() {
    return Resources.getSystem().getDisplayMetrics().widthPixels;
  }

  public static int getScreenHeight() {
    return Resources.getSystem().getDisplayMetrics().heightPixels;
  }
Hadi Ahmadi
  • 1,924
  • 2
  • 17
  • 38

1 Answers1

0

You can set addOnScrollListener on your RecyclerView to get notified when the user scrolls, and you can get the first/last visible views from LinearLayoutMangar or GridLayoutManager:

        RecyclerView recycler = findViewById(R.id.recycler_view);
        reycler.setAdapter(YOUR_ADAPTER);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);

        recycler.setLayoutManager(layoutManager);

        recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                //First visible item position.
                int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
                //Last visible item position.
                int lastVisiblePosition = layoutManager.findLastVisibleItemPosition();



               /*If you really need to access your visible views,
                 Loop through all the visible views*/.
                for (int position = firstVisiblePosition; position == lastVisiblePosition; position++) {
                    View lastVisibleView = layoutManager.getChildAt(firstVisiblePosition);
                    //do something
                }

                dataList.get(firstVisiblePosition);

            }
        });

More info from documentation RecyclerView.OnScrollListener have to functions:

onScrolled(RecyclerView recyclerView, int dx, int dy) Callback method to be invoked when the RecyclerView has been scrolled.

onScrollStateChanged(RecyclerView recyclerView, int newState) Callback method to be invoked when RecyclerView's scroll state changes.

Apparently, onScrolled is called when the scroll is completed.

For more info see Yigit answer`s

Abed
  • 3,999
  • 1
  • 17
  • 28