RecyclerView分离仍可见的视图

11

当前情况

我正在使用这个库 https://github.com/kanytu/android-parallax-recyclerview 在 RecyclerView 上实现视差效果。目前为止,一切都很好。但是,我想要像 Google Newsstand 一样获得一个效果,在这个效果中,标题仍在卡片下面。

问题

问题在于 RecyclerView(或 LinerLayoutManager)在列表的第一个元素接触到父视图顶部的瞬间就会分离标题视图:

enter image description here

如您所见,第一个 CardView 接触到顶部的瞬间便是 RecyclerView 分离标题的瞬间。

我确信逻辑本身没有问题,因为当卡片到达顶部时,我得到了RecyclerView.findViewHolderForPosition(0) == null,证明标题已被回收。

尝试的解决方案

我尝试了很多方法,比如:

ViewHolder.setIsRecyclable 使用此方法将持有者设置为不可回收,但没有任何效果。

LayoutManager.ignoreView 我尝试将视图标记为被忽略的,使其不被丢弃和回收。结果是会抛出一个异常,说: Trying to recycle an ignored view holder. You should first call stopIgnoringView(view) before calling recycle.

setItemViewCacheSize 没有任何效果。我尝试调用 setItemViewCacheSize(50),但它对标题没有任何影响。

setMaxRecycledViews 尝试将 viewType=HEADER 的最大回收视图设置为 0,但它仍然进行回收。

结论

因此我怀疑是否有任何方法可以将该项标记为不被分离,直到我下达指令(例如检查它是否仍然可见,然后将其分离)。

这也是一个在 Github 上的问题:https://github.com/kanytu/android-parallax-recyclerview/issues/7


setItemViewCacheSize会影响它吗?https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setItemViewCacheSize(int) - darnmason
@darnmason 不行,它似乎没有任何效果。getRecycledViewPool().setMaxRecycledViews()也没有用。 - Pedro Oliveira
我猜这是LayoutManager的工作,而不是RecyclerView的工作,也许你需要一个自定义的LayoutManager来永远不会分离第一个项目。 - darnmason
1
你说得对。我过去几天一直在使用自定义的LayoutManager,并且我已经接近最终解决方案了。然而,如果有帮助的话,那就更好了,这也是我提出问题的原因。 - Pedro Oliveira
我正在使用你的库,但是当我添加一个标题时,有时候当我打开导航抽屉时,标题颜色会丢失。你能帮我解决这个问题吗? - Shofiqul Alam
setItemViewCacheSize(0) 帮助我解决了类似的问题。 - Kirill Boyarshinov
1个回答

1

那需要很多更改,包括删除整个库并开始一个新的,这是多余的,因为这正是支持库一开始就做的。这不是预期的结果。通过更改LinearLayoutManager可以实现更好的修复。 - Pedro Oliveira
你找到解决方案了吗? - Guilherme Santos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接