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()){