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

时间:2016-10-24 13:59:58

标签: android scroll android-recyclerview floating-action-button

因此,如果您的RecyclerView延伸到屏幕的末尾并使用FloatingActionButton或第三方FloatingActionMenu,那么掩盖就会出现轻微问题:如果您滚动到列表的末尾,浮动按钮覆盖了行的一部分,没有办法看到或找到它下面的内容。

Android是否允许您:

  1. 检测您的列表中是否包含足够数量的项目,即屏幕底部是否有可见的行。
    1. 如果向下滚动到最后,请将按钮滑开,然后如果开始向上滚动则将其滑回?
    2. 编辑:或者,或者,在RecyclerView的末尾添加动态填充,只有在你完全滚动的情况下才会显示?

2 个答案:

答案 0 :(得分:6)

解决覆盖部分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() ...

答案 1 :(得分:0)

当然有可能。该解决方案已发布here。 其背后的主要思想是覆盖和更改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);
            }
        }
    });
}