代码之家  ›  专栏  ›  技术社区  ›  Tiago Redaelli

拖放仅在第一个

  •  0
  • Tiago Redaelli  · 技术社区  · 6 年前

    其次,在实际的层面上,我是否需要在每次成功删除后重新创建使用过的组件,或者我应该如何解决这个问题?

    我正在使用observables更新用户界面:

    private void handleObservedCheckers() {
        mainViewModel.checkerLiveData.observe(this, new Observer<Collection<Checker>>() {
            @Override
            public void onChanged(@Nullable Collection<Checker> checkers) {
                if (checkers == null)
                    return;
                Log.d(TAG, checkers.toString());
                for (Checker checker : checkers) {
                    CheckerView view = (CheckerView) nodeMap.get(checker.getPosition());
                    view.invalidate();
                    if (checker.getColor() == Color.RED) {
                        view.paintRed();
                        view.show();
                    }
                    else if (checker.getColor() == Color.BLUE) {
                        view.paintBlue();
                        view.show();
                    } else {
                        view.hide();
                    }
                    view.draggable = checker.isDraggable();
                    //view.invalidate();
                }
            }
        });
    }
    

    private View createChecker(int x, int y, int size, Position position) {
        final CheckerView view = new CheckerView(this, x, y, size, position);
        view.show();
        view.draggable = false;
        // Maps the view to the given position
        nodeMap.put(position, view);
        checkerViewList.add(view);
        Log.d(TAG, "created: " + view.toString());
    
        view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (view.draggable && event.getAction() == MotionEvent.ACTION_DOWN) {
                    // Save the position as clip data to be retrieved on drop
                    ClipData.Item item = new ClipData.Item("" + view.position);
                    ClipData data = new ClipData("", new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item);
                    // Start drag
                    View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                    view.startDragAndDrop(data, shadowBuilder, view, 0);
                    return true;
                } else {
                    return false;
                }
            }
        });
        view.setOnDragListener(new View.OnDragListener() {
            @Override
            public boolean onDrag(View v, DragEvent event) {
                switch (event.getAction()) {
                    case DragEvent.ACTION_DRAG_STARTED:
                        return true;
                    case DragEvent.ACTION_DRAG_EXITED:
                        return true;
                    case DragEvent.ACTION_DRAG_LOCATION:
                        return true;
                    case DragEvent.ACTION_DRAG_ENTERED:
                        return true;
                    case DragEvent.ACTION_DROP:
                        Log.w(TAG, "dropped");
                        // get stored position inside clip data if any exists
                        String data = (String) event.getClipData().getItemAt(0).getText();
                        if (!data.equals("")) {
                            mainViewModel.moveChecker(Position.valueOf(data), view.position);
                        } else {
                            mainViewModel.placeChecker(view.position);
                        }
    
                        return true;
                    case DragEvent.ACTION_DRAG_ENDED:
                        return true;
                    default:
                        return true;
                }
            }
        });
        return view;
    }
    

    我在每个周期都改为重画,这次我经常得到“Reporting drop result:false”。(参考: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/view/ViewRootImpl.java )

    1 回复  |  直到 6 年前
        1
  •  0
  •   Tiago Redaelli    6 年前

    将拖动侦听器附加到与on touch listner(用于阴影拖动)相同的组件的问题是,它只能将拖放注册到自身上看起来。。。