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