我一直在尝试实现相同的行为,这里是显示和隐藏工具栏的主要代码(放在包含 RecyclerView 的任何类中):
int toolbarMarginOffset = 0
private int dp(int inPixels){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, inPixels, getApplicationContext().getResources().getDisplayMetrics());
}
public RecyclerView.OnScrollListener onScrollListenerToolbarHide = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
toolbarMarginOffset += dy;
if(toolbarMarginOffset>dp(48)){
toolbarMarginOffset = dp(48);
}
if(toolbarMarginOffset<0){
toolbarMarginOffset = 0;
}
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)toolbar.getLayoutParams();
params.topMargin = -1*toolbarMarginOffset;
toolbar.setLayoutParams(params);
}
};
我已经包含了从像素转换为 dp 的 dp 函数,但显然将它设置为您的工具栏高度。 (将 dp(48) 替换为您的工具栏高度)
无论您在哪里设置 RecyclerView,都包括:
yourListView.setOnScrollListener(onScrollListenerToolbarHide);
但是,如果您还使用 SwipeRefreshLayout,则会出现一些其他问题。
我不得不将 RecyclerView 的适配器中第一个元素的 marginTop 设置为工具栏的高度加上原始偏移量。 (我知道有点黑客)。这样做的原因是我发现如果我更改了上面的代码以包括在滚动时更改 recyclerView 的 marginTop ,这是一种紧张的体验。所以我就是这样克服的。所以基本上设置你的布局,使你的工具栏浮动在 RecyclerView 的顶部(剪辑它)像这样的东西(在你的自定义 RecyclerView 适配器的 onBindViewHolder 中):
if(position==0){
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams)holder.card.getLayoutParams();
// params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
params.topMargin = dp(10+48);
}
最后,由于 RecyclerViews 刷新圈会有很大的偏移量,因此您需要将其偏移(回到持有 RecyclerView 的类的 onCreate 中):
swipeLayout.setProgressViewOffset(true,dp(48),dp(96));
我希望这对某人有所帮助。这是我的第一个详细答案,所以我希望我足够详细。