滚动到列表底部时隐藏 FloatingAction 项目?
Hiding FloatingAction items when you scroll to the bottom of a list?
所以如果你有一个延伸到屏幕末尾的 RecyclerView 并使用 FloatingActionButton 或第三方的 FloatingActionMenu,那么掩饰会有一个小问题:如果你滚动到列表的末尾, 浮动按钮覆盖了部分行,无法查看或访问其下方的内容。
有没有办法Android让你:
- 检测您的列表中是否包含足够数量的项目,即屏幕底部是否有一行可见。
和
- 如果您向下滚动到最后,请将按钮滑开,如果您开始向上滚动,则将它们滑回原处?
编辑:或者,或者,将动态填充添加到 RecyclerView 的末尾,只有当您一直向下滚动时才会显示?
当然可以。解决方案已发布 。
它背后的主要思想是 FloatingActionButton.Behavior
被覆盖和更改,以便它对 RecyclerView
和 CoordinatorLayout
滚动做出反应。
但是,您的情况 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()
...
所以如果你有一个延伸到屏幕末尾的 RecyclerView 并使用 FloatingActionButton 或第三方的 FloatingActionMenu,那么掩饰会有一个小问题:如果你滚动到列表的末尾, 浮动按钮覆盖了部分行,无法查看或访问其下方的内容。
有没有办法Android让你:
- 检测您的列表中是否包含足够数量的项目,即屏幕底部是否有一行可见。
和
- 如果您向下滚动到最后,请将按钮滑开,如果您开始向上滚动,则将它们滑回原处?
编辑:或者,或者,将动态填充添加到 RecyclerView 的末尾,只有当您一直向下滚动时才会显示?
当然可以。解决方案已发布 FloatingActionButton.Behavior
被覆盖和更改,以便它对 RecyclerView
和 CoordinatorLayout
滚动做出反应。
但是,您的情况 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()
...