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

Dro*_*kas 15 android android-recyclerview

Recyclerview现在有3个州.

SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING

为此提出的一个问题包括一个投掷状态.我无法确定是否有任何关于此的事情.

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

编辑:对此类功能的要求:当用户浏览时,我希望能够在回收器视图中暂停加载图像(所有图像都是URL请求)并在他到达感兴趣的项目后恢复,从而确保他是图像目前在其他人之前查看负载.

Tau*_*qir 7

SCROLL_STATE_FLING:不再RecyclerView文档中未提及的部分内容

关于您的要求:

RecyclerView在里面android.view.ViewGroup,根据其源代码,它extends ViewGroup 在这里提供文档.

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

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

请参阅此处了解详细信息在RecyclerView中进行Snappy滚动

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

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

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

  3. 加入另一个API是setPageMargin()setPageMarginDrawable(),让您轻松分开你的网页.

请参阅此处了解详细信息使用ViewPager进行水平视图滑动,已更新

Drag和Fling之间的区别

对于拖动功能您可以使用某些RecyclerView's伴随类:

  1. ItemTouchHelper,这是一个实用程序类,用于添加滑动以关闭并将支持拖放到RecyclerView.

  2. 它的ItemTouchHelper.Callback,它是ItemTouchHelper和你的应用程序之间的契约

对于投掷你可以看到

  1. 在RecyclerView上执行Android操作

  2. Android:控制平滑滚动回收器视图


Col*_*ire 6

我使用SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING这样做的组合:这是我的代码:

@Override
            public void onScrollStateChanged(int newState) {
                if (newState == RecyclerView.SCROLL_STATE_DRAGGING || newState == RecyclerView.SCROLL_STATE_SETTLING) {
                    if (mAdapter != null)
                        mAdapter.pauseImageLoading();
                } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    if (mAdapter != null)
                        mAdapter.resumeImageLoading();
                }
Run Code Online (Sandbox Code Playgroud)

这对我来说同样如你想要的那样,当用户停在感兴趣的项目时它恢复