【问题标题】:Estimate the final scroll position after flinging ends in Android?估计在Android中结束后的最终滚动位置?
【发布时间】:2015-03-13 19:18:49
【问题描述】:

我想在 Android ListView 上实现“捕捉”效果。具体来说,当 ListView 停止滚动时,我希望它停止在某些位置,以便完全显示第一个可见项目。为此,我需要能够估计当用户停止拖动或甩动时 ListView 将停止的最终位置。

在拖动的情况下,当我们收到 ACTION_UP 或 ACTION_CANCEL 事件时,我可以简单地读取当前的 Y 偏移作为最终位置。

然而,在投掷的情况下,当我们收到 ACTION_UP 或 ACTION_CANCEL 事件时,我需要一些额外的信息来确定 ListView 由于减速期而停止滚动的最终位置。

iOS 通过 willEndDragging 中的 targetContentOffset 参数提供此类信息。 Android 中是否有任何等效信息可用?

这与我提出的另一个问题有关,但没有得到回应:In Android, how to achieve snap effect on a listview while respecting acceleration caused by fling?

【问题讨论】:

  • 我不确定您要的是什么。你想计算一个 Listview 可以容纳的行数吗?或者,你喜欢计算 Listview 的高度吗?
  • @TheOriginalAndroid 我已经更新了问题。基本上,在fling的情况下,当我们收到ACTION_UP或ACTION_CANCEL事件时,我需要一些额外的信息来确定ListView会因为减速期而停止滚动的最终位置。
  • 我使用代码查看了您的其他帖子。只是作为吸引更多关注这篇文章的建议,我认为你的标题不适合这个问题,像我这样的一些人认为它与 iOS 问题有关,我对此一无所知。
  • @TheOriginalAndroid 感谢您的提示!我编辑了标题,但如果您有更好的建议,请告诉我。

标签: android listview android-listview


【解决方案1】:

我会覆盖您的 TestListView 的 OnScroll 事件,例如:

@Override
public void onScroll(AbsListView lw, final int firstVisibleItem, final int visibleItemCount, final int totalItemCount) {

    // Determine when the last row item is fully visible.
    final int lastItem = firstVisibleItem + visibleItemCount;
    if(lastItem >= totalItemCount) {
       Log.d("onScroll", "Reached last item");
       }
    }
}

请注意,此侦听器会在列表视图中为您提供第一个可见位置/项目,以及行项目数

我会使用这个监听器,因为有时 getFirstVisiblePosition() 并不准确,尤其是在我们使用的虚拟 ListView 上。 另一个onScroll 覆盖方法优于onTouchEvent 的优点是onScroll 覆盖的触发器比onTouchEvent 少。根据我的经验,它很快。 让我们发布,我对这个问题很感兴趣。问候,汤米奎

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多