Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在用户拖动边界附近的对象时滚动列表_Java_Android - Fatal编程技术网

Java 在用户拖动边界附近的对象时滚动列表

Java 在用户拖动边界附近的对象时滚动列表,java,android,Java,Android,我有一个问题,我一直无法解决的方式,我非常高兴 我有一个正在拖放到列表中的视图。该列表是使用recyclerView创建的。拖动对象工作正常,recyclerView的项目都可以接收事件,没有问题。现在,我想让列表在用户将手指靠近列表顶部或底部时滚动。我的第一步是向recyclerView添加一个DrageEvent侦听器,并尝试在每次获得靠近顶部或底部边缘的位置时开始滚动。我的DrageEvent.Location案例如下所示: case DragEvent.ACTION_DRAG_LOCAT

我有一个问题,我一直无法解决的方式,我非常高兴

我有一个正在拖放到列表中的视图。该列表是使用recyclerView创建的。拖动对象工作正常,recyclerView的项目都可以接收事件,没有问题。现在,我想让列表在用户将手指靠近列表顶部或底部时滚动。我的第一步是向recyclerView添加一个DrageEvent侦听器,并尝试在每次获得靠近顶部或底部边缘的位置时开始滚动。我的DrageEvent.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;
        }
case DragEvent.ACTION\u拖动位置:{
removeDragScrollCallBack();
float y=event.getY();
final int scrollAreaHeight=v.getHeight()/4;
最终结果=16;
int scrollmount=0;
如果(y>v.getHeight()-scrollAreaHeight){
总金额=10;
}否则如果(y<滚动区域高度){
滚动量=-10;
}
如果(数学绝对值(滚动量)>0){
final int finalScrollAmount=滚动金额;
dragScrollRunnable=新的Runnable(){
@凌驾
公开募捐{
if(可垂直滚动(最终滚动安装)){
滚动(0,最终滚动次数);
if(dragScrollHandler!=null&&dragScrollRunnable!=null){
postDelayed(这是delayMills);
}
}
}
};
dragScrollRunnable.run();
}
返回true;
}
有点用。事情朝着正确的方向发展。不过,它似乎有点溅射,而且通常滚动不太顺畅。此外,当“回收器”视图仍在滚动时,拖放事件有时不会传递给孩子们

所以,我去了谷歌的例子,使用列表视图在一个应用程序中做了类似的事情-。我修改了他们用于列表视图的代码,并尝试以类似的方式处理我的recyclerView。这对我来说效果更差

我尝试了这些技术的各种其他改变,并改用smoothScroll函数而不是标准的scroll函数,但我对任何结果都不太满意

有没有人有一个好的解决方案来处理这个问题


更新:我现在认为,我在这个功能上的许多问题都是由于拖动侦听器相当不可靠。有时,当回收器的子对象接收事件时,回收器无法获取事件。

结果表明,视图上的拖动侦听器不是非常可靠。当我在屏幕上随意移动手指时,拖动侦听器不会接收所有事件。我相信这是因为recyclerView的孩子们也收到了即时回调。解决方案是按照我最初尝试的方法,但通过片段本身的侦听器。现在,当我得到一个事件时,我检查坐标以查看它在哪个视图中,然后将它转换为该视图的局部坐标。然后我可以准确地确定我需要如何处理它。

结果是视图上的拖动侦听器不是非常可靠。当我在屏幕上随意移动手指时,拖动侦听器不会接收所有事件。我相信这是因为recyclerView的孩子们也收到了即时回调。解决方案是按照我最初尝试的方法,但通过片段本身的侦听器。现在,当我得到一个事件时,我检查坐标以查看它在哪个视图中,然后将它转换为该视图的局部坐标。然后我可以确定我需要如何处理它