【问题标题】:Android OnDragListener - ACTION_DRAG_ENDED firing multiple timesAndroid OnDragListener - ACTION_DRAG_ENDED 触发多次
【发布时间】:2016-04-29 18:58:19
【问题描述】:

我正在制作一个包含自定义行和自定义适配器的列表视图。我已将 OnTouchListener 和 OnDragListener 附加到列表视图中的每个视图。

如果放置结果为真,我将更新基础数据(被拖动的视图被放置在列表视图的范围内)

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;
        }

【问题讨论】:

    标签: android drag-and-drop ontouchlistener


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      private bool wasShown;
      

      在 ontouch 事件中做 false。

      wasShown = false;
      

      检查if,并在第一次在 ACTION_DRAG_ENDED 中运行时将其设置为 true。

      if (!wasShown){
      wasShown = true;
      ...
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-24
        • 1970-01-01
        • 2022-01-06
        • 2020-01-23
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多