Android OnDragListener - ACTION_DRAG_ENDED 触发多次

标签 android drag-and-drop ontouchlistener

我正在制作一个带有自定义行和自定义适配器的 ListView 。我已将 OnTouchListener 和 OnDragListener 附加到 ListView 中的每个 View 。

如果拖放结果为真(被拖动的 View 被拖放到 ListView 的边界内),我将更新基础数据

ACTION_DRAG_ENDED 案例会针对有效和无效丢弃触发 4 次,但我不知道为什么。谁能告诉我为什么会这样?

我的听众代码如下。

@Override
        public View getView(final int position, View convertView, final ViewGroup parent) {

            LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.lv_item_stage, parent, false);
            }

            //setting text/images for the view

            convertView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                        START_POS = position;

                        ClipData data = ClipData.newPlainText("", "");
                        View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                        view.startDrag(data, shadowBuilder, view, 0);
                        view.setVisibility(View.GONE);
                        return true;
                    } else {
                        return false;
                    }
                }
            });

            convertView.setOnDragListener(new View.OnDragListener() {
                @Override
                public boolean onDrag(final View v, DragEvent event) {
                    switch (event.getAction()) {
                        case DragEvent.ACTION_DRAG_ENTERED:
                            AbsListView.LayoutParams params = new AbsListView.LayoutParams(v.getWidth(), v.getHeight()*2);

                            if(position > START_POS){
                                //view dragged downwards
                                moveData(START_POS, position);
                                ((LinearLayout) v).setGravity(Gravity.TOP);
                            }
                            else{
                                //view dragged upwards
                                moveData(START_POS, position);
                                ((LinearLayout ) v).setGravity(Gravity.BOTTOM);
                            }

                            v.setLayoutParams(params);

                            START_POS = position;
                            break;

                        case DragEvent.ACTION_DRAG_EXITED:
                            //go straight into ACTION_DROP case (resize view to original size)
                        case DragEvent.ACTION_DROP:
                            v.setLayoutParams(new AbsListView.LayoutParams(v.getWidth(), v.getHeight()/2));
                            break;
                        case DragEvent.ACTION_DRAG_ENDED:
                            //update list view if drop valid (inside list view)
                            if (event.getResult()){
                                Log.d("listView", "result = TRUE");
                                updateListView(tempData);
                            }
                            else{
                                Log.d("listView", "result = FALSE");
                            }

                            final View droppedView = (View) event.getLocalState();
                            droppedView.post(new Runnable() {
                                @Override
                                public void run() {
                                    droppedView.setVisibility(View.VISIBLE);
                                }
                            });
                            break;
                        default:
                            break;
                    }
                    return true;
                }
            });
            return convertView;
        }

最佳答案

ACTION_DRAG_ENDED 将为您附加了拖动监听器的每个 View 触发一次。 ACTION_DRAG_STARTED 也是如此。因此,如果您将 onDragListener 附加到 4 个 View ,这些事件将触发 4 次。

关于Android OnDragListener - ACTION_DRAG_ENDED 触发多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36945641/

相关文章:

java - MotionEvent.ACTION_UP 未被调用

android - 如何捕捉浏览器 Activity ?

Android:动画位置在完成后重置

android - android中的ontouch : getting X and Y coordinates and drawing circle on that point

javascript - 可以在拖动开始后异步设置 event.dataTransfer 吗?

javascript - 在 Javascript 中捕捉拖入文本字段的图像

java - 如何在缩小时将图像返回到原始位置 - Android

android - 参数异常 : Requested value 'X86' was not found

android - 适用于Android设备的视频库

java - 如何在两个面板之间拖放形状