diff --git a/Android/doric/src/main/java/pub/doric/shader/SuperNode.java b/Android/doric/src/main/java/pub/doric/shader/SuperNode.java index 6cdcadae..e88ee4fb 100644 --- a/Android/doric/src/main/java/pub/doric/shader/SuperNode.java +++ b/Android/doric/src/main/java/pub/doric/shader/SuperNode.java @@ -148,4 +148,33 @@ public abstract class SuperNode extends ViewNode { } } + private boolean viewIdIsEqual(JSObject src, JSObject target) { + String srcId = src.asObject().getProperty("id").asString().value(); + String targetId = target.asObject().getProperty("id").asString().value(); + return srcId.equals(targetId); + } + + protected void recursiveMixin(JSObject src, JSObject target) { + JSObject srcProps = src.getProperty("props").asObject(); + JSObject targetProps = target.getProperty("props").asObject(); + for (String key : srcProps.propertySet()) { + JSValue jsValue = srcProps.getProperty(key); + if ("subviews".equals(key) && jsValue.isArray()) { + JSValue[] subviews = jsValue.asArray().toArray(); + for (JSValue subview : subviews) { + JSValue oriSubviews = targetProps.getProperty("subviews"); + if (oriSubviews.isArray()) { + for (JSValue targetSubview : oriSubviews.asArray().toArray()) { + if (viewIdIsEqual(subview.asObject(), targetSubview.asObject())) { + recursiveMixin(subview.asObject(), targetSubview.asObject()); + break; + } + } + } + } + continue; + } + targetProps.asObject().setProperty(key, jsValue); + } + } } diff --git a/Android/doric/src/main/java/pub/doric/shader/list/ListNode.java b/Android/doric/src/main/java/pub/doric/shader/list/ListNode.java index 92e611d9..3349c844 100644 --- a/Android/doric/src/main/java/pub/doric/shader/list/ListNode.java +++ b/Android/doric/src/main/java/pub/doric/shader/list/ListNode.java @@ -44,10 +44,15 @@ public class ListNode extends SuperNode { @Override protected void blendSubNode(JSObject subProperties) { - ViewNode node = getSubNodeById(subProperties.getProperty("id").asString().value()); + String viewId = subProperties.getProperty("id").asString().value(); + ViewNode node = getSubNodeById(viewId); if (node != null) { node.blend(subProperties.getProperty("props").asObject()); } else { + JSObject oldModel = getSubModel(viewId); + if (oldModel != null) { + recursiveMixin(subProperties, oldModel); + } listAdapter.blendSubNode(subProperties); } } diff --git a/Android/doric/src/main/java/pub/doric/shader/slider/SliderNode.java b/Android/doric/src/main/java/pub/doric/shader/slider/SliderNode.java index 0fbbcb23..8cfceaa5 100644 --- a/Android/doric/src/main/java/pub/doric/shader/slider/SliderNode.java +++ b/Android/doric/src/main/java/pub/doric/shader/slider/SliderNode.java @@ -77,10 +77,15 @@ public class SliderNode extends SuperNode { @Override protected void blendSubNode(JSObject subProperties) { - ViewNode node = getSubNodeById(subProperties.getProperty("id").asString().value()); + String viewId = subProperties.getProperty("id").asString().value(); + ViewNode node = getSubNodeById(viewId); if (node != null) { node.blend(subProperties.getProperty("props").asObject()); } else { + JSObject oldModel = getSubModel(viewId); + if (oldModel != null) { + recursiveMixin(subProperties, oldModel); + } slideAdapter.blendSubNode(subProperties); } }