滚动到列表底部时隐藏 FloatingAction 项目?

Hiding FloatingAction items when you scroll to the bottom of a list?

所以如果你有一个延伸到屏幕末尾的 RecyclerView 并使用 FloatingActionButton 或第三方的 FloatingActionMenu,那么掩饰会有一个小问题:如果你滚动到列表的末尾, 浮动按钮覆盖了部分行,无法查看或访问其下方的内容。

有没有办法Android让你:

  1. 检测您的列表中是否包含足够数量的项目,即屏幕底部是否有一行可见。

  1. 如果您向下滚动到最后,请将按钮滑开,如果您开始向上滚动,则将它们滑回原处?

编辑:或者,或者,将动态填充添加到 RecyclerView 的末尾,只有当您一直向下滚动时才会显示?

当然可以。解决方案已发布 。 它背后的主要思想是 FloatingActionButton.Behavior 被覆盖和更改,以便它对 RecyclerViewCoordinatorLayout 滚动做出反应。

但是,您的情况 RecyclerViewScrollListener 必须不同。这是实现:

private class RecyclerViewScrollListener extends RecyclerView.OnScrollListener {
    FloatingActionButton mChild;

    public RecyclerViewScrollListener(FloatingActionButton child) {
        this.mChild = child;
    }

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (newState == RecyclerView.SCROLL_STATE_IDLE && recyclerView.canScrollVertically(Integer.MAX_VALUE)) {
            mChild.show();
        } else {
            mChild.hide();
        }
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (!recyclerView.canScrollVertically(Integer.MAX_VALUE)) {
            mChild.hide();
        }
    }
}

编辑:

当用数据填充 RecyclerView 时,对其调用这样的函数以禁用或启用滚动:

private void changeCoordinatorLayoutScrollPossibility(final RecyclerView recyclerView) {
    new Handler().post(new Runnable() {
        @Override
        public void run() {
            if (recyclerView.getMeasuredHeight() < alertsRecyclerView.computeVerticalScrollRange()) {
                recyclerView.setNestedScrollingEnabled(true);
            } else {
                recyclerView.setNestedScrollingEnabled(false);
            }
        }
    });
}

解决覆盖部分 UI 问题的常见模式是在用户开始向下滚动时隐藏 FAB ...您可以通过此代码片段(与 RecyclerView 一起使用)实现此目的:

    fDemandsRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if(dy > 0 ){
                if(fFab.isShown()) fFab.hide();
            } else {
                if(!fFab.isShown()) fFab.show();
            }
        }
    });

如果你坚持在最后隐藏它并且你正在使用 RecyclerView 和 LinearLayoutManager,你可以在 OnScrollListener 回调期间检查 LayoutManager 对象上的方法 findLastCompletelyVisibleItemPosition() ...