如何知道RecyclerView/LinearLayoutManager是滚动到顶部还是底部?

Sar*_*ius 73 android android-recyclerview

目前我正在使用以下代码来检查是否应启用SwipeRefreshLayout.

private void laySwipeToggle() {
    if (mRecyclerView.getChildCount() == 0 || mRecyclerView.getChildAt(0).getTop() == 0) {
        mLaySwipe.setEnabled(true);
    } else {
        mLaySwipe.setEnabled(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

但这是问题所在.当它滚动到另一个项目的视图时,边界mRecyclerView.getChildAt(0).getTop()也会返回0.

问题

有什么像RecyclerView.isScrolledToBottom()RecyclerView.isScrolledToTop()

编辑:(mRecyclerView.getChildAt(0).getTop() == 0 && linearLayoutManager.findFirstVisibleItemPosition() == 0)有点做RecyclerView.isScrolledToTop(),但是怎么样RecyclerView.isScrolledToBottom()

hum*_*kie 102

解决方案在布局管理器中.

LinearLayoutManager layoutManager = new LinearLayoutManager(this);

// Add this to your Recycler view
recyclerView.setLayoutManager(layoutManager);

// To check if at the top of recycler view
if(layoutManager.firstCompletelyVisibleItemPosition()==0){
    // Its at top
}

// To check if at the bottom of recycler view
if(layoutManager.lastCompletelyVisibleItemPosition()==data.size()-1){
    // Its at bottom
}
Run Code Online (Sandbox Code Playgroud)

编辑

如果您的项目大小大于屏幕,请使用以下内容检测顶级事件.

RecyclerView recyclerView = (RecyclerView) view;
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();

int pos = linearLayoutManager.findFirstVisibleItemPosition();

if(linearLayoutManager.findViewByPosition(pos).getTop()==0 && pos==0){
    return true;
}
Run Code Online (Sandbox Code Playgroud)

PS:实际上,如果你RecyclerView直接把它放在里面,SwipeRefreshview你就不需要这样做了

  • `lastVisibleItemPosition`和`lastCompletelyVisibleItemPosition`都不起作用.(无法解决方法).救命? (4认同)
  • 如果最后一个项目的高度大于屏幕高度,`findLastCompletelyVisibleItemPosition`将失败.这意味着最后一项是可见的,但不是完全可见的,所以`layout.findLastCompletelyVisibleItemPosition()= - 1(RecyclerView.NO_POSITION)`.使用`lastVisibleItemPosition`并检查布局中最后一个视图的底部是否更安全. (4认同)
  • 如果项目(第一个或最后一个)大于整个屏幕,则会失败.因为,`first/lastCompletelyVisibleItemPosition()`将返回-1,暗示,根本没有完全可见的项. (2认同)

Pen*_*zzz 64

recyclerView.canScrollVertically(int direction)如果您只是需要知道是否可以滚动,您可以尝试

  • 方向整数:-1表示向上,1表示向下,0表示总是返回false. (4认同)
  • 大!当我们到达滚动结束时返回false,我需要此事件. (2认同)

She*_*lji 32

为了检查是否RecyclerView滚动到底部.使用以下代码.

/**
     * Check whether the last item in RecyclerView is being displayed or not
     *
     * @param recyclerView which you would like to check
     * @return true if last position was Visible and false Otherwise
     */
    private boolean isLastItemDisplaying(RecyclerView recyclerView) {
        if (recyclerView.getAdapter().getItemCount() != 0) {
            int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
            if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
                return true;
        }
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

一些额外的信息

如果你想实现ScrollToBottomRecyclerView时候Edittexttapped那么我建议你加1秒的延迟是这样的:

 edittext.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP)
                    if (isLastItemDisplaying(recyclerView)) {
// The scrolling can happen instantly before keyboard even opens up so to handle that we add 1 second delay to scrolling
                        recyclerView.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount() - 1);

                            }
                        }, 1000);
                    }
                return false;
            }
        });
Run Code Online (Sandbox Code Playgroud)


Tej*_*oid 20

@Saren Arterius,使用RecycleViewaddOnScrollListener,您可以找到Vertical RecycleView的滚动顶部或底部,如下所示,

RecyclerView rv = (RecyclerView)findViewById(R.id.rv);

rv.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

                if (dy < 0) {
                    // Recycle view scrolling up...

                } else if (dy > 0) {
                    // Recycle view scrolling down...
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)


Man*_*ddy 6

您可以使用以下命令检测 top

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
          }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if(isRecyclerViewAtTop())
            {
                //your recycler view reached Top do some thing
             }
        }
    });

  private boolean isRecyclerViewAtTop()   {
        if(recyclerView.getChildCount() == 0)
            return true;
        return recyclerView.getChildAt(0).getTop() == 0;
    }
Run Code Online (Sandbox Code Playgroud)

当您到达顶部后释放手指时,这将检测顶部,如果您想在 reacyclerview 到达顶部后立即检测,请检查if(isRecyclerViewAtTop())内部onScrolled 方法

  • 这似乎是错误的。`getChildAt()` 返回 `ViewGroup` 的第一个子元素,它可能(并且将会)与列表的第一个元素不同。如果该子级恰好与 recyclerview 的顶部完全对齐,那么您的 IsRecyclerViewAtTop() 方法将返回 true,即使它不在顶部。 (5认同)

kar*_*ava 6

使用recyclerView.canScrollVertically(int方向)检查滚动的顶部还是底部。

方向= 1向下滚动(底部)

方向= -1向上滚动(顶部)

如果方法返回false,则意味着您到达顶部还是底部取决于方向。


SGa*_*Gal 5

只需保持对layoutManager的引用,并在Recycler视图上设置onScrollListener,就像这样

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        visibleItemCount = mRecyclerView.getChildCount();
        totalItemCount = mLayoutManager.getItemCount();
        firstVisibleItemIndex = mLayoutManager.findFirstVisibleItemPosition();

        //synchronizew loading state when item count changes
        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        if (!loading)
            if ((totalItemCount - visibleItemCount) <= firstVisibleItemIndex) {
                // Loading NOT in progress and end of list has been reached
                // also triggered if not enough items to fill the screen
                // if you start loading
                loading = true;
            } else if (firstVisibleItemIndex == 0){
                // top of list reached
                // if you start loading
                loading = true;
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 你应该使用`addOnScrollListener`,因为@shajeelAfzal现在不推荐使用`setOnScrollListener`,你应该使用`addOnScrollListener`,因为@shajeelAfzal现在不推荐使用`setOnScrollListener`,请查看[here](https://developer.android.com /reference/android/support/v7/widget/RecyclerView.html#setOnScrollListener%28android.support.v7.widget.RecyclerView.OnScrollListener%29]) (2认同)