handle layout reset width

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/08515fe1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/08515fe1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/08515fe1

Branch: refs/heads/0.16-dev
Commit: 08515fe19fc35879807e6e66fb14310d52d8da58
Parents: 649ec4c
Author: jianbai.gbj <jianbai....@alibaba-inc.com>
Authored: Wed Sep 13 15:28:34 2017 +0800
Committer: jianbai.gbj <jianbai....@alibaba-inc.com>
Committed: Wed Sep 13 15:28:34 2017 +0800

----------------------------------------------------------------------
 .../com/taobao/weex/dom/WXCellDomObject.java    | 41 +++++++++++++-
 .../taobao/weex/dom/binding/BindingUtils.java   |  2 +
 .../taobao/weex/ui/component/WXComponent.java   |  7 +++
 .../weex/ui/component/binding/Layouts.java      |  2 -
 .../weex/ui/component/binding/Statements.java   | 58 ++++++++++++--------
 .../list/template/WXRecyclerTemplateList.java   | 24 +++-----
 6 files changed, 92 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/08515fe1/android/sdk/src/main/java/com/taobao/weex/dom/WXCellDomObject.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXCellDomObject.java 
b/android/sdk/src/main/java/com/taobao/weex/dom/WXCellDomObject.java
index 0990143..bb3694d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXCellDomObject.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXCellDomObject.java
@@ -47,12 +47,51 @@ public class WXCellDomObject extends WXDomObject {
             WXLogUtils.d("getAvailableWidth:"+w);
             node.setLayoutWidth(w);
           }
-        }
+        }else if (node instanceof  WXCellDomObject){
+          WXCellDomObject slotDomObject = (WXCellDomObject) node;
+          WXRecyclerDomObject recyclerDomObject = 
slotDomObject.getRecyclerDomObject();
+          if(recyclerDomObject == null){
+              return;
+          }
+          if(slotDomObject.isSticky()){
+              float w = recyclerDomObject.getAvailableWidth();
+              node.setLayoutWidth(w);
+              measureOutput.width  = w;
+          }else {
+              if(!recyclerDomObject.hasPreCalculateCellWidth()){
+                  recyclerDomObject.preCalculateCellWidth();
+              }
+              float w = recyclerDomObject.getColumnWidth();
+              if(w <= 0 && recyclerDomObject.getColumnCount() <= 1){
+                  w = recyclerDomObject.getAvailableWidth();
+              }
+              node.setLayoutWidth(w);
+              measureOutput.width  = w;
+          }
       }
+
+    }
     }
   };
 
   public WXCellDomObject() {
     setMeasureFunction(CELL_MEASURE_FUNCTION);
   }
+
+
+    public boolean isSticky() {
+        return getStyles().isSticky();
+    }
+    private  WXRecyclerDomObject recyclerDomObject;
+
+
+
+    public WXRecyclerDomObject getRecyclerDomObject() {
+        return recyclerDomObject;
+    }
+
+    public void setRecyclerDomObject(WXRecyclerDomObject recyclerDomObject) {
+        this.recyclerDomObject = recyclerDomObject;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/08515fe1/android/sdk/src/main/java/com/taobao/weex/dom/binding/BindingUtils.java
----------------------------------------------------------------------
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/dom/binding/BindingUtils.java 
b/android/sdk/src/main/java/com/taobao/weex/dom/binding/BindingUtils.java
index 1a5eaef..e54d4f0 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/binding/BindingUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/binding/BindingUtils.java
@@ -33,6 +33,8 @@ public class BindingUtils {
 
     public static final String BINDING = "@binding";
 
+    public static final String ALIAS = "@alias";
+
     /**
      * @param value check object is binding expression
      * */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/08515fe1/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
----------------------------------------------------------------------
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java 
b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
index 4b2b517..98b41f5 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
@@ -1663,6 +1663,13 @@ public abstract class  WXComponent<T extends View> 
implements IWXObject, IWXActi
       this.waste = waste;
       WXDomObject domObject = (WXDomObject) getDomObject();
       if(waste){
+          if(domObject.getAttrs().getStatement() == null) {
+              domObject.setVisible(false);
+              if (getHostView() != null) {
+                getHostView().setVisibility(View.GONE);
+              }
+              return;
+          }
           
if(Constants.Value.VISIBLE.equals(domObject.getAttrs().get(Constants.Name.VIF_FALSE))){
              domObject.setVisible(true);
              if(getHostView() != null){

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/08515fe1/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java
----------------------------------------------------------------------
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java 
b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java
index a231658..bf0abfc 100644
--- 
a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java
+++ 
b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Layouts.java
@@ -30,8 +30,6 @@ import com.taobao.weex.ui.component.WXVContainer;
  * Created by furture on 2017/8/21.
  */
 public class Layouts {
-
-
     /**
      * do dom layout, and set layout to component
      * */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/08515fe1/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Statements.java
----------------------------------------------------------------------
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Statements.java
 
b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Statements.java
index 8fc11ab..37b0224 100644
--- 
a/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Statements.java
+++ 
b/android/sdk/src/main/java/com/taobao/weex/ui/component/binding/Statements.java
@@ -49,7 +49,7 @@ import java.util.Set;
  */
 public class Statements {
     /**
-     * recursive copy component,
+     * recursive copy component, none parent connect
      * */
     public static WXComponent copyComponentTree(WXComponent component){
         WXComponent copy =  copyComponentTree(component, 
component.getParent());
@@ -167,8 +167,7 @@ public class Statements {
                             renderNode.applyLayoutAndEvent(renderNode);
                             renderNode.bindData(renderNode);
                         }
-                        doRenderBindingAttrs(renderNode, domObject, context);
-                        doRenderChildNode(renderNode, context);
+                        doBindingAttrsEventAndRenderChildNode(renderNode, 
domObject, context);
                         renderIndex++;
                     }
                     context.pop();
@@ -192,15 +191,16 @@ public class Statements {
                 }
             }
         }
-        doRenderBindingAttrs(component, domObject, context);
-        doRenderChildNode(component, context);
+        doBindingAttrsEventAndRenderChildNode(component, domObject, context);
         return  1;
     }
 
     /**
-     * bind attrs and doRenderComponent next
+     * bind attrs and doRender component child
      * */
-    private static void doRenderChildNode(WXComponent component, ArrayStack 
context){
+    private static void doBindingAttrsEventAndRenderChildNode(WXComponent 
component, WXDomObject domObject, ArrayStack context){
+        int stackSize = context.size();
+        doRenderBindingAttrsAndEvent(component, domObject, context);
         if(component instanceof WXVContainer){
             WXVContainer container = (WXVContainer) component;
             for(int k=0; k<container.getChildCount();){
@@ -208,6 +208,9 @@ public class Statements {
                 k += doRenderComponent(next, context);
             }
         }
+        while (context.size() > stackSize){
+            context.pop();
+        }
     }
 
 
@@ -222,14 +225,14 @@ public class Statements {
     /**
      * render dynamic binding attrs and bind them to component node.
      * */
-    private static void doRenderBindingAttrs(WXComponent component, 
WXDomObject domObject, ArrayStack context){
+    private static void doRenderBindingAttrsAndEvent(WXComponent component, 
WXDomObject domObject, ArrayStack context){
         component.setWaste(false);
         WXAttr attr = domObject.getAttrs();
         if(attr != null
                 && attr.getBindingAttrs() != null
                 && attr.getBindingAttrs().size() > 0){
             ArrayMap<String, Object> bindAttrs = 
domObject.getAttrs().getBindingAttrs();
-            Map<String, Object> dynamic =  getBindingAttrs(bindAttrs, context);
+            Map<String, Object> dynamic =  renderBindingAttrs(bindAttrs, 
context);
             Set<Map.Entry<String, Object>> entries = dynamic.entrySet();
 
             /**
@@ -274,28 +277,37 @@ public class Statements {
      * @param  context  context
      * return binding attrs rended value in context
      * */
-    public static Map<String, Object> getBindingAttrs(ArrayMap bindAttrs, 
ArrayStack context){
+    public static Map<String, Object> renderBindingAttrs(ArrayMap bindAttrs, 
ArrayStack context){
         Set<Map.Entry<String, Object>> entrySet = bindAttrs.entrySet();
         Map<String, Object> dynamic = new HashMap<>();
         for(Map.Entry<String, Object> entry : entrySet){
-            Object binding = entry.getValue();
+            Object value = entry.getValue();
             String key = entry.getKey();
-            if(entry.getValue() instanceof  JSONObject
-                    && (((JSONObject) binding).get(BindingUtils.BINDING)  
instanceof  Block)){
-                Block block = (Block) (((JSONObject) 
binding).get(BindingUtils.BINDING));
-                dynamic.put(key, block.execute(context));
-            }else if(binding instanceof JSONArray){
-                JSONArray array = (JSONArray) binding;
+            if(value instanceof  JSONObject
+                    && (((JSONObject) value).get(BindingUtils.BINDING)  
instanceof  Block)){
+                JSONObject binding = (JSONObject) value;
+                Block block = (Block) (binding.get(BindingUtils.BINDING));
+                Object blockValue = block.execute(context);
+                dynamic.put(key, blockValue);
+                if(binding.getString(BindingUtils.ALIAS) != null){
+                   String alias =  binding.getString(BindingUtils.ALIAS);
+                    Map map = new ArrayMap(4);
+                    map.put(alias, blockValue);
+                    context.push(map);
+                }
+            }else if(value instanceof JSONArray){
+                JSONArray array = (JSONArray) value;
                 StringBuilder builder = new StringBuilder();
                 for(int i=0; i<array.size(); i++){
-                    Object value = array.get(i);
-                    if(value instanceof  CharSequence){
-                        builder.append(value);
+                    Object element = array.get(i);
+                    if(element instanceof  CharSequence){
+                        builder.append(element);
                         continue;
                     }
-                    if(value instanceof JSONObject
-                            && (((JSONObject) value).get(BindingUtils.BINDING) 
instanceof Block)){
-                        Block block = (Block) (((JSONObject) 
value).get(BindingUtils.BINDING));
+                    if(element instanceof JSONObject
+                            && (((JSONObject) 
element).get(BindingUtils.BINDING) instanceof Block)){
+                        JSONObject binding = (JSONObject) element;
+                        Block block = (Block) 
(binding.get(BindingUtils.BINDING));
                         Object blockValue = block.execute(context);
                         if(blockValue == null){
                             blockValue = "";

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/08515fe1/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/WXRecyclerTemplateList.java
----------------------------------------------------------------------
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/WXRecyclerTemplateList.java
 
b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/WXRecyclerTemplateList.java
index e8a9179..04e2070 100644
--- 
a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/WXRecyclerTemplateList.java
+++ 
b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/WXRecyclerTemplateList.java
@@ -1063,17 +1063,6 @@ public class WXRecyclerTemplateList extends 
WXVContainer<BounceRecyclerView> imp
         if(component == null){
             return;
         }
-        if(getDomObject() instanceof  WXRecyclerDomObject){
-            WXRecyclerDomObject domObject = (WXRecyclerDomObject) 
getDomObject();
-            if(!domObject.hasPreCalculateCellWidth()){
-                domObject.preCalculateCellWidth();
-            }
-            if(component.getDomObject() instanceof WXCellDomObject){
-                WXCellDomObject cellDomObject = (WXCellDomObject) 
component.getDomObject();
-                float w = ((WXRecyclerDomObject) domObject).getColumnWidth();
-                cellDomObject.setLayoutWidth(w);
-            }
-        }
         long start = System.currentTimeMillis();
         templateViewHolder.setHolderPosition(position);
         Statements.doRender(component, getStackContextForPosition(position));
@@ -1090,15 +1079,18 @@ public class WXRecyclerTemplateList extends 
WXVContainer<BounceRecyclerView> imp
     public TemplateViewHolder onCreateViewHolder(ViewGroup parent, int 
viewType) {
         long start = System.currentTimeMillis();
         String template = mTemplateViewTypes.keyAt(viewType);
-        WXCell component = mTemplates.get(template);
-        if(component != null){
-            component = (WXCell) Statements.copyComponentTree(component);
-        }
-        if(component == null){
+        WXCell source = mTemplates.get(template);
+        if(source == null){
             FrameLayout view = new FrameLayout(getContext());
             view.setLayoutParams(new FrameLayout.LayoutParams(0, 0));
             return new TemplateViewHolder(view, viewType);
         }
+        WXCell component = (WXCell) Statements.copyComponentTree(source);
+        if(component.getDomObject() instanceof  WXCellDomObject
+                && getDomObject() instanceof  WXRecyclerDomObject){
+            WXCellDomObject domObject = (WXCellDomObject) 
component.getDomObject();
+            domObject.setRecyclerDomObject((WXRecyclerDomObject) 
getDomObject());
+        }
         component.lazy(false);
         component.createView();
         if(WXEnvironment.isApkDebugable()){

Reply via email to