2016-02-12 59 views
0

我有一个问题,我一直无法解决,我非常满意。当用户在边界附近拖动对象时滚动列表

我有一种观点,我拖放到列表中。该列表是使用recyclerView创建的。拖动对象工作正常,recyclerView的项目都可以接收事件没有问题。现在我想让用户将他们的手指拖动到列表顶部或底部附近时进行滚动。我的第一步是将dragEvent侦听器添加到recyclerView,并在每次获得靠近顶部或底部边缘的位置时尝试开始滚动。所以,我的DragEvent.Location案例看起来像这样:

case DragEvent.ACTION_DRAG_LOCATION: { 

      removeDragScrollCallBack(); 

      float y = event.getY(); 
      final int scrollAreaHeight = v.getHeight()/4; 
      final int delayMills = 16; 
      int scrollAmount = 0; 

      if (y > v.getHeight() - scrollAreaHeight) { 
       scrollAmount = 10; 
      } else if (y < scrollAreaHeight) { 
       scrollAmount = -10; 
      } 

      if (Math.abs(scrollAmount) > 0) { 

       final int finalScrollAmount = scrollAmount; 

       dragScrollRunnable = new Runnable() { 
        @Override 
        public void run() { 

         if (canScrollVertically(finalScrollAmount)) { 
          scrollBy(0, finalScrollAmount); 

          if (dragScrollHandler != null && dragScrollRunnable != null) { 
           dragScrollHandler.postDelayed(this, delayMills); 
          } 
         } 
        } 
       }; 

       dragScrollRunnable.run(); 
      } 

      return true; 
     } 

它有点作品。事情朝着正确的方向滚动。它似乎有些嘲笑,而且一般不会很顺利地滚动。此外,回收站视图仍在滚动时,拖放放置事件有时不会传递给子节点。

所以,我去使用列表视图 - link做类似的事情的谷歌的例子。我修改了他们用于列表视图的代码,并尝试以类似的方式处理我的recyclerView。这对我来说结果甚至更差。

我已经尝试过各种这些技术的其他改动,并换成使用smoothScroll函数而不是标准滚动函数,但我对任何结果都不满意。

有没有人有如何处理这个好的解决方案?

更新:我现在认为我的这个功能的许多问题是由于拖动监听器相当不可靠。在儿童接收事件时,有时回收商未能收到事件。

回答

0

原来,视图上的拖动监听器并不十分可靠。随着我在屏幕上移动手指,随机时间,拖动监听器不会收到所有事件。我相信这样做的原因是回收商View的孩子也接受了拖动回调。解决的办法是做我最初尝试过的东西,但通过片段本身的听众。现在,当我得到一个事件时,我检查坐标以查看它在哪个视图中,然后将其转换为该视图的本地坐标。然后我可以确定我需要如何处理它。

相关问题