【问题标题】:How to detect RecyclerView scroll due to bottom-most item height decrease?由于最底部的项目高度降低,如何检测 RecyclerView 滚动?
【发布时间】:2018-01-29 02:24:54
【问题描述】:

情况

RecyclerView 有一个OnScrollListener,它在手动或以编程方式滚动时提供回调。

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

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

问题

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

【问题讨论】:

    标签: android scroll android-recyclerview


    【解决方案1】:

    想出了一个替代方案,虽然效果很好。

    首先,我将this library 用于可扩展项目。
    该库在展开状态更新时有回调,包括:

    • 已扩展,
    • 扩展,
    • 正在崩溃,
    • 已崩溃。

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

    1. 先检查该项是否为最后一项
    2. 检查状态是否正在崩溃
    3. 记住最后一项开始折叠时的顶部位置
    4. 通过计算现有顶部位置与记忆顶部位置之间的差值,手动触发 RecyclerView 的 onScroll

    以上都是试图模拟RecyclerView的onScroll。幸运的是,结果证明效果很好。

    代码片段:(在ExpandableLayoutonExpansionUpdateListener 内)

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多