RecyclerView滚动拖动和关闭

时间:2017-11-17 16:34:18

标签: android android-recyclerview

我有从顶部设置动画的叠加视图。在那个场景中,我有带元素列表的回收视图。

当用户将列表滚动到最后时,进一步滚动应该向上滚动整个回收站视图(在下面显示视图),并在ACTION_UP上滚动回收器到屏幕外。

覆盖onTouch事件并不起作用:

  1. RecyclerView.setOnTouch() - 导致拖动到小故障
  2. ParentView.setOnTouch() - 仅在拖动其他视图时才起作用(不是自己的RecyclerView)。
  3. 这就像新的Tinder卷轴揭示了反应(2017-11-17)

    任何想法怎么做?

2 个答案:

答案 0 :(得分:1)

试试这个:

  recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
        }
    });

在onScrolled方法中,您可以翻译整个recyclerView。

要检查您是否已达到目的,请在onScrolled方法中使用此方法

recyclerView.canScrollVertically(1);

这将返回一个布尔值。然后,您可以检查并移动视图。 希望这会有所帮助。

答案 1 :(得分:0)

好的,我自己解决了。当我谈到故障时onTouch我犯了一个错误。我将翻译设置为RecyclerView,但我使用了MotionEvent.getX()代替MotionEvent.getRawX(),由于getX()

返回的触摸坐标不一致导致了这种狂野故障

另外

  

recyclerView.canScrollVertically(1);

Sarthak Gandhi的帮助。

override fun onTouch(p0: View?, p1: MotionEvent): Boolean {
    if (p1.action == MotionEvent.ACTION_UP && dragging) {
        dragging = false
        mInitailPoint = null
        currentDy.invoke(0F)
        return true
    }

    if (p1.action == MotionEvent.ACTION_DOWN || p1.action == MotionEvent.ACTION_MOVE) {
        if (!dragging && !recyclerView.canScrollVertically(1)) {
            mInitailPoint = Point(p1.rawX.toInt(), p1.rawY.toInt())
            mCurrentPoint = Point(p1.rawX.toInt(), p1.rawY.toInt())
            dragging = true
            return true
        } else if (dragging && p1.action == MotionEvent.ACTION_MOVE) {
            mCurrentPoint = Point(p1.rawX.toInt(), p1.rawY.toInt())

            val dy = mCurrentPoint!!.y.toFloat() - mInitailPoint!!.y.toFloat()
            if (dy < 0) {
                currentDy.invoke(dy)
            } else {
                currentDy.invoke(0F)
                dragging = false
                return false
            }
            return true
        }
    }
    return false
}

此时currentDy.invoke(dy)实际上将翻译设置为RecyclerView当然这不是完整的代码来实现更好的东西而且没有动画动画,但这部分是关于这个问题的。

故事的道德:如果您为要翻译的视图设置OnTouchListener,请使用原始坐标来计算翻译