区分Recyclerview中的Drag动作和Fling动作

时间:2016-02-04 07:13:59

标签: android android-recyclerview

Recyclerview现在有3个州。

SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING

issue为此提出了一个包括一个投掷状态。我无法确定是否有任何相关的事情。

有没有办法区分Recyclerview中的Drag和Fling。

编辑:对此类功能的要求: 当用户徘徊时,我希望能够在回收者视图中暂停加载图像(所有图像都是网址请求)并在他到达感兴趣的项目后恢复,从而确保他当前正在查看的图像在其他图像之前加载。 / p>

3 个答案:

答案 0 :(得分:7)

SCROLL_STATE_FLING:不再是RecyclerView的一部分,因为documentation here中未提及

关于您的要求

RecyclerView位于android.view.ViewGroup内,根据其源代码extends ViewGroup documentation here

RecyclerView中的滚动在RecyclerView和LinearLayoutManager之间分开。有两种情况需要处理:

  1. 用户将视图翻转。默认行为是RecyclerView将fling传递给内部Scroller,然后内部Scroller执行滚动魔术。这是有问题的,因为RecyclerView通常会处于未绑定的位置。通过覆盖RecyclerView fling()实施而不是flingingsmoothscroll LinearLayoutManager到位置来解决此问题。
  2. 用户以不足的速度抬起手指以启动滚动。在这种情况下不会发生甩尾。如果要在视图未处于捕捉位置时检测到这种情况,可以通过覆盖onTouchEvent方法来执行此操作。
  3. 请参阅此处了解详情Snappy scrolling in RecyclerView

    值得一提的ViewPager一些RecyclerView提示是其中的一个孩子:

    1. 考虑修改缓存的页面数。当您只有3或4页时,这一点尤为重要。默认设置将在当前页面的两侧存储1页。在您有3个页面的情况下,滑动到中间页面意味着将缓存所有页面。然后滑动到第一页或最后一页将删除其中一个页面的内存,当您再次向后滑动时,需要重新创建并重新添加这些页面。通过设置setOffscreenPageLimit(2),您将允许所有页面始终保留在内存中。这是性能和内存考虑因素之间的权衡,因此最好是监听低内存警告并准备好在必要时删除边缘页面。

    2. 如果您尝试在ViewPager中替换视图,仅更改适配器后面的数据集并调用notifyDataSetChanged()是不够的。您还需要确保已正确实施getItemPosition(Object object)并为已更改的项目返回POSITION_NONE并返回POSITION_UNCHANGED或未更改项目的实际位置。

    3. 添加的另一个API是setPageMargin()setPageMarginDrawable(),可让您轻松分隔您的网页。

    4. 请参阅此处了解详情Horizontal View Swiping with ViewPager, Updated

      拖动和投掷之间的区别

      对于拖动功能您可以使用某些RecyclerView's个随播广告类:

      1. ItemTouchHelper,这是一个实用程序类,用于添加滑动以关闭和拖动&放弃对RecyclerView的支持。

      2. ItemTouchHelper.Callback,这是ItemTouchHelper与您的应用程序之间的合约

      3. 对于 fling ,您可以看到

        1. Android fling actions on a RecyclerView

        2. Android : Control Smooth scroll over recycler view

答案 1 :(得分:6)

我使用GUI的组合来执行此操作:这是我的代码:

key='123' and label='123 test' then my condition fails

这对我来说同样适用于当用户停留在感兴趣的项目

时恢复

答案 2 :(得分:1)

您的问题可能以不同的方式解决。您可以尝试将请求推迟几百毫秒(确切的数字需要调整)。如果列表项在这些毫秒内滚动屏幕外,您可以在发送之前取消该请求。我们的想法是,如果您投掷,视图将在屏幕外滚动,以便在发送之前始终取消请求。如果他们没有投掷,那么每个请求额外的毫秒数希望对经验来说并不算太糟糕。