如何检测由于最底部物品高度减少而导致的RecyclerView滚动?

时间:2018-01-29 02:24:54

标签: android scroll android-recyclerview

情况

RecyclerViewOnScrollListener,可在手动或以编程方式滚动时提供回调。

然而,我发现它错过了一个场景 - 当RecyclerView的底部项目的高度降低时。

用几句话可能很难想象,让我举个例子:
我有一个RecyclerView,其中包含一些可扩展项。当用户折叠展开的项目时,项目视图高度将降低 现在,假设用户正在查看底部的展开项目,RecyclerView也会滚动到底部。如果用户现在折叠该项目,RecyclerView将调整其内容'位置,以便最底部项目的底部始终触及RecyclewView 的底部。
情况如下图所示:

Image Demo

问题

实际上,我必须听这个RecyclerView的滚动事件来调整一些视图元素(例如顶部的顶部浮动条)。但是因为"滚动"由于这样的项目高度变化不会触发OnScrollListener,我该如何以其他方式收听此滚动?

1 个答案:

答案 0 :(得分:0)

想出了一个替代方案,但效果非常好。

首先,我使用this library作为可扩展项目 当扩展状态更新时,此库具有回调,包括:

  • 扩展,
  • 扩展,
  • 折叠,
  • 折叠。

由于这种情况只发生在最后一项的折叠上,所以我所做的是:

  1. 首先检查项目是否为最后一项
  2. 检查状态是否正在崩溃
  3. 记住最后一个项目开始崩溃时的最高位置
  4. 通过计算现有顶部位置和记忆顶部位置之间的差异,手动触发RecyclerView的onScroll
  5. 以上所有内容都试图模拟RecyclerView的onScroll。幸运的是,结果很好。

    代码段:(在ExpandableLayout的内部onExpansionUpdateListener

    if (state == ExpandableLayout.State.COLLAPSING) {
        if (lastItemTopPosition == null) {
            lastItemTopPosition = itemView.getTop();
        } else {
            if (getAdapterPosition()+1 == getItemCount()) { //The last item
                recyclerViewCompounded.onScroll(0, lastItemTopPosition - itemView.getTop());
                lastItemTopPosition = itemView.getTop();
            }
        }
    } else if (state == ExpandableLayout.State.COLLAPSED) {
        lastItemTopPosition = null;
    }