我正在创建一个RecyclerView
带有标题,当您向上滚动时标题会折叠RecyclerView
。我可以通过下面的布局非常接近地实现这一点,并使用透明的AppBarLayout
, and MyCoolView
这是标题。视差效果效果很好。
但是,如果标题仍然可见并且我将RecyclerView
时,RV 缓慢滚动到顶部,并且某些项目位于工具栏下方,直到 RV 到达视图顶部。我一直在玩scrollFlags
但没有取得理想的结果。关于如何改善投掷体验以免物品被剪裁有什么建议吗?
观看视频并观看其抛出时的情况 ---https://www.dropbox.com/s/jppd6m7zo41k23z/20160609_151309.mp4?dl=0
<android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.AppBarLayout
android:background="#00000000">
<android.support.design.widget.CollapsingToolbarLayout
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<com.android.myapp.MyCoolView
app:layout_collapseMode="parallax"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView/>
</android.support.design.widget.CoordinatorLayout>
可能的解决方案(未经测试)。添加一个OnOffsetChangedListener
给你的AppBarLayout
,并记下偏移值。首先声明该字段:
private boolean shouldScroll = false;
然后,在创建时:
AppBarLayout appbar = findViewById(...);
appbar.addOnOffsetChangedListener(new OnOffsetChangedListener() {
@Override
void onOffsetChanged(AppBarLayout appbar, int offset) {
// Allow recycler scrolling only if we started collapsing.
this.shouldScroll = offset != 0;
}
});
现在,向 RecyclerView 添加一个滚动侦听器。每当它尝试滚动时,如果 AppBarLayout 仍处于展开状态,则恢复滚动:
RecyclerView recycler = findViewById(...);
recycler.addOnScrollListener(new OnScrollListener() {
@Override
void onScrolled(RecyclerView recycler, int dx, int dy) {
// If AppBar is fully expanded, revert the scroll.
if (!shouldScroll) {
recycler.scrollTo(0,0);
}
}
});
但这可能需要一些调整。我看到两个问题:
- 如果scrollTo()回调onScrolled(),可能会出现堆栈溢出。可以通过布尔值或通过删除/添加滚动侦听器来解决
- 您可能不仅希望在 AppBarLayout 完全展开时防止滚动,而且更普遍地在 AppBarLayout 未折叠时防止滚动。这意味着您不必检查
offset != 0
,而是为了offset == appBarLayout.getTotalScrollRange()
。我认为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)