You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by cx...@apache.org on 2017/03/06 02:32:48 UTC

[4/4] incubator-weex git commit: * [ios] revert recycler merge

* [ios] revert recycler merge


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

Branch: refs/heads/0.11-dev
Commit: 3621001f16cbdfdc0ce6b7848fc771401def5550
Parents: 11352c7
Author: cxfeng <cx...@gmail.com>
Authored: Mon Mar 6 10:32:38 2017 +0800
Committer: cxfeng <cx...@gmail.com>
Committed: Mon Mar 6 10:32:38 2017 +0800

----------------------------------------------------------------------
 .../main/java/com/taobao/weex/WXSDKEngine.java  |   9 +-
 .../java/com/taobao/weex/common/Constants.java  |  13 +-
 .../main/java/com/taobao/weex/dom/WXAttr.java   |  96 +---
 .../java/com/taobao/weex/dom/WXDomHandler.java  |   2 -
 .../java/com/taobao/weex/dom/WXDomManager.java  |   1 -
 .../java/com/taobao/weex/dom/WXDomModule.java   |   8 +-
 .../taobao/weex/dom/WXRecyclerDomObject.java    | 317 -----------
 .../weex/ui/component/WXBasicComponentType.java |   2 -
 .../com/taobao/weex/ui/component/WXHeader.java  |   4 +-
 .../ui/component/list/BasicListComponent.java   |  32 +-
 .../ui/component/list/ListComponentView.java    |   3 +
 .../ui/component/list/SimpleListComponent.java  |   6 +-
 .../weex/ui/component/list/WXListComponent.java |  91 +---
 .../listview/ExtendedLinearLayoutManager.java   |  25 -
 .../weex/ui/view/listview/WXRecyclerView.java   |  43 +-
 .../listview/adapter/ListBaseViewHolder.java    |   6 -
 .../adapter/RecyclerViewBaseAdapter.java        |  21 +-
 .../adapter/WXRecyclerViewOnScrollListener.java | 107 ++--
 .../ui/view/refresh/wrapper/BaseBounceView.java |  19 +-
 .../refresh/wrapper/BounceRecyclerView.java     |  23 +-
 .../refresh/wrapper/BounceScrollerView.java     |   1 -
 examples/vue/components/waterfall.vue           | 455 ----------------
 examples/vue/index.vue                          |   1 -
 ios/playground/Podfile                          |   2 +-
 ios/playground/WeexDemo/DemoDefine.h            |   2 +-
 ios/playground/WeexDemo/UIView+UIThreadCheck.m  |   2 +-
 ios/playground/WeexDemo/WXDemoViewController.m  |   3 +-
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       |  75 +--
 .../Component/Recycler/WXMultiColumnLayout.h    |  42 --
 .../Component/Recycler/WXMultiColumnLayout.m    | 388 --------------
 .../Component/Recycler/WXRecyclerComponent.h    |  12 -
 .../Component/Recycler/WXRecyclerComponent.m    | 525 -------------------
 .../Recycler/WXRecyclerDataController.h         |  34 --
 .../Recycler/WXRecyclerDataController.m         | 114 ----
 .../Recycler/WXRecyclerUpdateController.h       |  32 --
 .../Recycler/WXRecyclerUpdateController.m       | 248 ---------
 .../Recycler/WXSectionDataController.h          |  33 --
 .../Recycler/WXSectionDataController.m          |  81 ---
 .../WeexSDK/Sources/Component/WXCellComponent.h |  22 +-
 .../WeexSDK/Sources/Component/WXCellComponent.m |  27 +-
 .../Component/WXComponent+GradientColor.h       |  15 +-
 .../Component/WXComponent+GradientColor.m       |  15 +-
 .../Sources/Component/WXFooterComponent.h       |  13 -
 .../Sources/Component/WXFooterComponent.m       |  13 -
 .../Sources/Component/WXHeaderComponent.h       |  27 -
 .../Sources/Component/WXHeaderComponent.m       |  68 ---
 .../WeexSDK/Sources/Component/WXListComponent.h |  12 +
 .../WeexSDK/Sources/Component/WXListComponent.m |  71 ++-
 ios/sdk/WeexSDK/Sources/Component/WXTransform.m |  18 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m    |   2 -
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |   2 +-
 .../WeexSDK/Sources/Module/WXAnimationModule.m  |   8 +-
 ios/sdk/WeexSDK/Sources/Module/WXMetaModule.m   |   4 +-
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.h     |   2 -
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.m     |  29 -
 ios/sdk/WeexSDK/Sources/Utility/WXDiffUtil.h    |  38 --
 ios/sdk/WeexSDK/Sources/Utility/WXDiffUtil.m    | 186 -------
 ios/sdk/WeexSDK/Sources/Utility/WXLength.h      |  13 +-
 ios/sdk/WeexSDK/Sources/Utility/WXLength.m      |  45 +-
 .../Sources/View/WXComponent+ViewManagement.m   |   4 +-
 60 files changed, 236 insertions(+), 3276 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
index f7bbee7..9992681 100755
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
@@ -143,10 +143,11 @@ import com.taobao.weex.dom.TextAreaEditTextDomObject;
 import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.dom.WXDomRegistry;
 import com.taobao.weex.dom.WXListDomObject;
-import com.taobao.weex.dom.WXRecyclerDomObject;
 import com.taobao.weex.dom.WXScrollerDomObject;
 import com.taobao.weex.dom.WXSwitchDomObject;
 import com.taobao.weex.dom.WXTextDomObject;
+import com.taobao.weex.ui.component.list.SimpleListComponent;
+import com.taobao.weex.ui.module.WXModalUIModule;
 import com.taobao.weex.http.WXStreamModule;
 import com.taobao.weex.ui.ExternalLoaderComponentHolder;
 import com.taobao.weex.ui.IExternalComponentGetter;
@@ -175,11 +176,9 @@ import com.taobao.weex.ui.component.WXText;
 import com.taobao.weex.ui.component.WXVideo;
 import com.taobao.weex.ui.component.WXWeb;
 import com.taobao.weex.ui.component.list.HorizontalListComponent;
-import com.taobao.weex.ui.component.list.SimpleListComponent;
 import com.taobao.weex.ui.component.list.WXCell;
 import com.taobao.weex.ui.component.list.WXListComponent;
 import com.taobao.weex.ui.module.WXMetaModule;
-import com.taobao.weex.ui.module.WXModalUIModule;
 import com.taobao.weex.ui.module.WXTimerModule;
 import com.taobao.weex.ui.module.WXWebViewModule;
 import com.taobao.weex.utils.WXLogUtils;
@@ -353,7 +352,7 @@ public class WXSDKEngine {
         WXBasicComponentType.SLIDER_NEIGHBOR
       );
       registerComponent(SimpleListComponent.class,false,"simplelist");
-      registerComponent(WXListComponent.class, false,WXBasicComponentType.LIST,WXBasicComponentType.VLIST,WXBasicComponentType.RECYCLER,WXBasicComponentType.WATERFALL);
+      registerComponent(WXListComponent.class, false,WXBasicComponentType.LIST,WXBasicComponentType.VLIST);
       registerComponent(HorizontalListComponent.class,false,WXBasicComponentType.HLIST);
       registerComponent(WXBasicComponentType.CELL, WXCell.class, true);
       registerComponent(WXBasicComponentType.INDICATOR, WXIndicator.class, true);
@@ -393,8 +392,6 @@ public class WXSDKEngine {
       registerDomObject(WXBasicComponentType.VLIST, WXListDomObject.class);
       registerDomObject(WXBasicComponentType.HLIST, WXListDomObject.class);
       registerDomObject(WXBasicComponentType.SCROLLER, WXScrollerDomObject.class);
-      registerDomObject(WXBasicComponentType.RECYCLER, WXRecyclerDomObject.class);
-      registerDomObject(WXBasicComponentType.WATERFALL, WXRecyclerDomObject.class);
     } catch (WXException e) {
       WXLogUtils.e("[WXSDKEngine] register:", e);
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
index 125ae3a..e6e61e9 100755
--- a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
@@ -296,17 +296,13 @@ public class Constants {
     String RESIZE_MODE = "resizeMode";
     String SHOW_INDICATORS = "showIndicators";
     String AUTO_PLAY = "autoPlay";
+    String SHOW_SCROLLBAR = "showScrollbar";
     String SCROLL_DIRECTION = "scrollDirection";
     String SCOPE = "scope";
     String RECYCLE = "recycle";
     String LOADMORERETRY = "loadmoreretry";
     String LOADMOREOFFSET = "loadmoreoffset";
     String RECYCLE_IMAGE = "recycleImage";
-    String LAYOUT = "layout";
-    String COLUMN_WIDTH= "columnWidth";
-    String COLUMN_COUNT= "columnCount";
-    String COLUMN_GAP= "columnGap";
-    String SHOW_SCROLLBAR= "showScrollbar";
     String OVERFLOW = "overflow";
     String TYPE = "type";
     String PLACEHOLDER = "placeholder";
@@ -356,19 +352,12 @@ public class Constants {
 
     String INSERT_CELL_ANIMATION = "insertAnimation";
     String DELETE_CELL_ANIMATION = "deleteAnimation";
-    String AUTO = "auto";
-    String NORMAL = "normal";
   }
 
   public interface Value {
 
     int NAV_BAR_SHOWN = 0;
     int NAV_BAR_HIDDEN = 1;
-    int AUTO = -1;
-    int COLUMN_GAP_NORMAL = 32;
-    int COLUMN_COUNT_NORMAL = 1;
-    String MULTI_COLUMN= "multi-column";
-    String GRID= "grid";
     String STICKY = "sticky";
     String FIXED = "fixed";
     String LEFT = "left";

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/dom/WXAttr.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXAttr.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXAttr.java
index 3846319..a9ebf60 100755
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXAttr.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXAttr.java
@@ -210,7 +210,6 @@ import android.text.TextUtils;
 
 import com.taobao.weex.common.Constants;
 import com.taobao.weex.common.WXImageSharpen;
-import com.taobao.weex.ui.view.listview.WXRecyclerView;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
 import com.taobao.weex.utils.WXViewUtils;
@@ -219,8 +218,6 @@ import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
 
-import static java.lang.Boolean.parseBoolean;
-
 /**
  * store value of component attribute
  *
@@ -335,7 +332,7 @@ public class WXAttr implements Map<String, Object>,Cloneable {
       return true;
     }
     try {
-      return parseBoolean(String.valueOf(obj));
+      return Boolean.parseBoolean(String.valueOf(obj));
     } catch (Exception e) {
       WXLogUtils.e("[WXAttr] recycle:", e);
     }
@@ -349,7 +346,7 @@ public class WXAttr implements Map<String, Object>,Cloneable {
     }
 
     try {
-      return parseBoolean(String.valueOf(obj));
+      return Boolean.parseBoolean(String.valueOf(obj));
     } catch (Exception e) {
       WXLogUtils.e("[WXAttr] showIndicators:", e);
     }
@@ -363,7 +360,7 @@ public class WXAttr implements Map<String, Object>,Cloneable {
     }
 
     try {
-      return parseBoolean(String.valueOf(obj));
+      return Boolean.parseBoolean(String.valueOf(obj));
     } catch (Exception e) {
       WXLogUtils.e("[WXAttr] autoPlay:", e);
     }
@@ -412,7 +409,7 @@ public class WXAttr implements Map<String, Object>,Cloneable {
     }
 
     try {
-      return parseBoolean(String.valueOf(obj));
+      return Boolean.parseBoolean(String.valueOf(obj));
     } catch (Exception e) {
       WXLogUtils.e("[WXAttr] recycleImage:", e);
     }
@@ -440,91 +437,6 @@ public class WXAttr implements Map<String, Object>,Cloneable {
     return ret;
   }
 
-  public float getColumnWidth(){
-
-    Object obj = get(Constants.Name.COLUMN_WIDTH);
-    if (obj == null) {
-      return Constants.Value.AUTO;
-    }
-
-    String value = String.valueOf(obj);
-    if(Constants.Name.AUTO.equals(value)){
-      return Constants.Value.AUTO;
-    }
-
-    try {
-      float columnWidth = Float.parseFloat(value);
-      return columnWidth > 0 ? columnWidth : 0;
-    } catch (Exception e) {
-      WXLogUtils.e("[WXAttr] getColumnWidth:", e);
-    }
-    return Constants.Value.AUTO;
-  }
-
-  public int getColumnCount() {
-
-    Object obj = get(Constants.Name.COLUMN_COUNT);
-    if (obj == null) {
-      return Constants.Value.AUTO;
-    }
-
-    String value = String.valueOf(obj);
-    if(Constants.Name.AUTO.equals(value)){
-      return Constants.Value.AUTO;
-    }
-
-    try {
-      int columnCount = Integer.parseInt(value);
-      return columnCount > 0 ? columnCount : Constants.Value.AUTO;
-    } catch (Exception e) {
-      WXLogUtils.e("[WXAttr] getColumnCount:", e);
-      return Constants.Value.AUTO;
-    }
-  }
-
-  public float getColumnGap() {
-
-    Object obj = get(Constants.Name.COLUMN_GAP);
-    if (obj == null) {
-      return Constants.Value.COLUMN_GAP_NORMAL;
-    }
-
-    String value = String.valueOf(obj);
-    if (Constants.Name.NORMAL.equals(value)) {
-      return Constants.Value.COLUMN_GAP_NORMAL;
-    }
-
-    try {
-      float columnGap = Float.parseFloat(value);
-      return columnGap >= 0 ? columnGap : Constants.Value.AUTO;
-    } catch (Exception e) {
-      WXLogUtils.e("[WXAttr] getColumnGap:", e);
-    }
-    return Constants.Value.COLUMN_GAP_NORMAL;
-  }
-
-  public int getLayoutType(){
-    Object obj = get(Constants.Name.LAYOUT);
-    if (obj == null) {
-      return WXRecyclerView.TYPE_LINEAR_LAYOUT;
-    }
-
-    try {
-      switch(String.valueOf(obj)){
-        case Constants.Value.MULTI_COLUMN :
-          return  WXRecyclerView.TYPE_STAGGERED_GRID_LAYOUT;
-        case Constants.Value.GRID :
-          return  WXRecyclerView.TYPE_GRID_LAYOUT;
-        default:
-          return WXRecyclerView.TYPE_LINEAR_LAYOUT;
-      }
-    } catch (Exception e) {
-      WXLogUtils.e("[WXAttr] getLayoutType:", e);
-    }
-    return WXRecyclerView.TYPE_LINEAR_LAYOUT;
-  }
-
-
   @Override
   public boolean equals(Object o) {
     return map.equals(o);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
index 987d71b..dc8495e 100755
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
@@ -210,7 +210,6 @@ import android.os.Message;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.bridge.JSCallback;
-import com.taobao.weex.utils.WXLogUtils;
 
 /**
  * Handler for dom operations.
@@ -291,7 +290,6 @@ public class WXDomHandler implements Handler.Callback {
                                      (String) task.args.get(2));
         break;
       case MsgType.WX_DOM_BATCH:
-
         mWXDomManager.batch();
         mHasBatch = false;
         break;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/dom/WXDomManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomManager.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomManager.java
index 6a8f534..d7ebaa7 100755
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomManager.java
@@ -335,7 +335,6 @@ public final class WXDomManager {
    * Batch the execution of {@link WXDomStatement}
    */
   void batch() {
-
     throwIfNotDomThread();
     Iterator<Entry<String, WXDomStatement>> iterator = mDomRegistries.entrySet().iterator();
     while (iterator.hasNext()) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
index d7067ad..ae097fc 100755
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
@@ -347,11 +347,7 @@ public final class WXDomModule extends WXModule {
           if (args == null) {
             return null;
           }
-          JSONObject option =null;
-          if(args.size()>1) {
-            option = (JSONObject) args.get(1);
-          }
-          scrollToElement((String) args.get(0),option);
+          scrollToElement((String) args.get(0), (JSONObject) args.get(1));
           break;
         case ADD_RULE:
           if (args == null) {
@@ -613,7 +609,7 @@ public final class WXDomModule extends WXModule {
    * @param options scroll option, like {offset:0, duration:300}
    */
   public void scrollToElement(String ref, JSONObject options) {
-    if (TextUtils.isEmpty(ref) ) {
+    if (TextUtils.isEmpty(ref) || options == null) {
       return;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/dom/WXRecyclerDomObject.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXRecyclerDomObject.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXRecyclerDomObject.java
deleted file mode 100644
index 3ee0e06..0000000
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXRecyclerDomObject.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/**
- *
- *                                  Apache License
- *                            Version 2.0, January 2004
- *                         http://www.apache.org/licenses/
- *
- *    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
- *
- *    1. Definitions.
- *
- *       "License" shall mean the terms and conditions for use, reproduction,
- *       and distribution as defined by Sections 1 through 9 of this document.
- *
- *       "Licensor" shall mean the copyright owner or entity authorized by
- *       the copyright owner that is granting the License.
- *
- *       "Legal Entity" shall mean the union of the acting entity and all
- *       other entities that control, are controlled by, or are under common
- *       control with that entity. For the purposes of this definition,
- *       "control" means (i) the power, direct or indirect, to cause the
- *       direction or management of such entity, whether by contract or
- *       otherwise, or (ii) ownership of fifty percent (50%) or more of the
- *       outstanding shares, or (iii) beneficial ownership of such entity.
- *
- *       "You" (or "Your") shall mean an individual or Legal Entity
- *       exercising permissions granted by this License.
- *
- *       "Source" form shall mean the preferred form for making modifications,
- *       including but not limited to software source code, documentation
- *       source, and configuration files.
- *
- *       "Object" form shall mean any form resulting from mechanical
- *       transformation or translation of a Source form, including but
- *       not limited to compiled object code, generated documentation,
- *       and conversions to other media types.
- *
- *       "Work" shall mean the work of authorship, whether in Source or
- *       Object form, made available under the License, as indicated by a
- *       copyright notice that is included in or attached to the work
- *       (an example is provided in the Appendix below).
- *
- *       "Derivative Works" shall mean any work, whether in Source or Object
- *       form, that is based on (or derived from) the Work and for which the
- *       editorial revisions, annotations, elaborations, or other modifications
- *       represent, as a whole, an original work of authorship. For the purposes
- *       of this License, Derivative Works shall not include works that remain
- *       separable from, or merely link (or bind by name) to the interfaces of,
- *       the Work and Derivative Works thereof.
- *
- *       "Contribution" shall mean any work of authorship, including
- *       the original version of the Work and any modifications or additions
- *       to that Work or Derivative Works thereof, that is intentionally
- *       submitted to Licensor for inclusion in the Work by the copyright owner
- *       or by an individual or Legal Entity authorized to submit on behalf of
- *       the copyright owner. For the purposes of this definition, "submitted"
- *       means any form of electronic, verbal, or written communication sent
- *       to the Licensor or its representatives, including but not limited to
- *       communication on electronic mailing lists, source code control systems,
- *       and issue tracking systems that are managed by, or on behalf of, the
- *       Licensor for the purpose of discussing and improving the Work, but
- *       excluding communication that is conspicuously marked or otherwise
- *       designated in writing by the copyright owner as "Not a Contribution."
- *
- *       "Contributor" shall mean Licensor and any individual or Legal Entity
- *       on behalf of whom a Contribution has been received by Licensor and
- *       subsequently incorporated within the Work.
- *
- *    2. Grant of Copyright License. Subject to the terms and conditions of
- *       this License, each Contributor hereby grants to You a perpetual,
- *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- *       copyright license to reproduce, prepare Derivative Works of,
- *       publicly display, publicly perform, sublicense, and distribute the
- *       Work and such Derivative Works in Source or Object form.
- *
- *    3. Grant of Patent License. Subject to the terms and conditions of
- *       this License, each Contributor hereby grants to You a perpetual,
- *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- *       (except as stated in this section) patent license to make, have made,
- *       use, offer to sell, sell, import, and otherwise transfer the Work,
- *       where such license applies only to those patent claims licensable
- *       by such Contributor that are necessarily infringed by their
- *       Contribution(s) alone or by combination of their Contribution(s)
- *       with the Work to which such Contribution(s) was submitted. If You
- *       institute patent litigation against any entity (including a
- *       cross-claim or counterclaim in a lawsuit) alleging that the Work
- *       or a Contribution incorporated within the Work constitutes direct
- *       or contributory patent infringement, then any patent licenses
- *       granted to You under this License for that Work shall terminate
- *       as of the date such litigation is filed.
- *
- *    4. Redistribution. You may reproduce and distribute copies of the
- *       Work or Derivative Works thereof in any medium, with or without
- *       modifications, and in Source or Object form, provided that You
- *       meet the following conditions:
- *
- *       (a) You must give any other recipients of the Work or
- *           Derivative Works a copy of this License; and
- *
- *       (b) You must cause any modified files to carry prominent notices
- *           stating that You changed the files; and
- *
- *       (c) You must retain, in the Source form of any Derivative Works
- *           that You distribute, all copyright, patent, trademark, and
- *           attribution notices from the Source form of the Work,
- *           excluding those notices that do not pertain to any part of
- *           the Derivative Works; and
- *
- *       (d) If the Work includes a "NOTICE" text file as part of its
- *           distribution, then any Derivative Works that You distribute must
- *           include a readable copy of the attribution notices contained
- *           within such NOTICE file, excluding those notices that do not
- *           pertain to any part of the Derivative Works, in at least one
- *           of the following places: within a NOTICE text file distributed
- *           as part of the Derivative Works; within the Source form or
- *           documentation, if provided along with the Derivative Works; or,
- *           within a display generated by the Derivative Works, if and
- *           wherever such third-party notices normally appear. The contents
- *           of the NOTICE file are for informational purposes only and
- *           do not modify the License. You may add Your own attribution
- *           notices within Derivative Works that You distribute, alongside
- *           or as an addendum to the NOTICE text from the Work, provided
- *           that such additional attribution notices cannot be construed
- *           as modifying the License.
- *
- *       You may add Your own copyright statement to Your modifications and
- *       may provide additional or different license terms and conditions
- *       for use, reproduction, or distribution of Your modifications, or
- *       for any such Derivative Works as a whole, provided Your use,
- *       reproduction, and distribution of the Work otherwise complies with
- *       the conditions stated in this License.
- *
- *    5. Submission of Contributions. Unless You explicitly state otherwise,
- *       any Contribution intentionally submitted for inclusion in the Work
- *       by You to the Licensor shall be under the terms and conditions of
- *       this License, without any additional terms or conditions.
- *       Notwithstanding the above, nothing herein shall supersede or modify
- *       the terms of any separate license agreement you may have executed
- *       with Licensor regarding such Contributions.
- *
- *    6. Trademarks. This License does not grant permission to use the trade
- *       names, trademarks, service marks, or product names of the Licensor,
- *       except as required for reasonable and customary use in describing the
- *       origin of the Work and reproducing the content of the NOTICE file.
- *
- *    7. Disclaimer of Warranty. Unless required by applicable law or
- *       agreed to in writing, Licensor provides the Work (and each
- *       Contributor provides its Contributions) on an "AS IS" BASIS,
- *       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- *       implied, including, without limitation, any warranties or conditions
- *       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- *       PARTICULAR PURPOSE. You are solely responsible for determining the
- *       appropriateness of using or redistributing the Work and assume any
- *       risks associated with Your exercise of permissions under this License.
- *
- *    8. Limitation of Liability. In no event and under no legal theory,
- *       whether in tort (including negligence), contract, or otherwise,
- *       unless required by applicable law (such as deliberate and grossly
- *       negligent acts) or agreed to in writing, shall any Contributor be
- *       liable to You for damages, including any direct, indirect, special,
- *       incidental, or consequential damages of any character arising as a
- *       result of this License or out of the use or inability to use the
- *       Work (including but not limited to damages for loss of goodwill,
- *       work stoppage, computer failure or malfunction, or any and all
- *       other commercial damages or losses), even if such Contributor
- *       has been advised of the possibility of such damages.
- *
- *    9. Accepting Warranty or Additional Liability. While redistributing
- *       the Work or Derivative Works thereof, You may choose to offer,
- *       and charge a fee for, acceptance of support, warranty, indemnity,
- *       or other liability obligations and/or rights consistent with this
- *       License. However, in accepting such obligations, You may act only
- *       on Your own behalf and on Your sole responsibility, not on behalf
- *       of any other Contributor, and only if You agree to indemnify,
- *       defend, and hold each Contributor harmless for any liability
- *       incurred by, or claims asserted against, such Contributor by reason
- *       of your accepting any such warranty or additional liability.
- *
- *    END OF TERMS AND CONDITIONS
- *
- *    APPENDIX: How to apply the Apache License to your work.
- *
- *       To apply the Apache License to your work, attach the following
- *       boilerplate notice, with the fields enclosed by brackets "[]"
- *       replaced with your own identifying information. (Don't include
- *       the brackets!)  The text should be enclosed in the appropriate
- *       comment syntax for the file format. We also recommend that a
- *       file or class name and description of purpose be included on the
- *       same "printed page" as the copyright notice for easier
- *       identification within third-party archives.
- *
- *    Copyright 2016 Alibaba Group
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
-package com.taobao.weex.dom;
-
-import com.taobao.weex.WXEnvironment;
-import com.taobao.weex.common.Constants;
-import com.taobao.weex.dom.flex.Spacing;
-import com.taobao.weex.ui.component.WXBasicComponentType;
-import com.taobao.weex.utils.WXLogUtils;
-import com.taobao.weex.utils.WXViewUtils;
-
-import java.util.Map;
-
-/**
- * Created by zhengshihan on 2017/2/21.
- */
-
-public class WXRecyclerDomObject extends WXDomObject{
-
-
-    private int mColumnCount = Constants.Value.COLUMN_COUNT_NORMAL;
-    private float mColumnWidth = Constants.Value.AUTO;
-    private float mColumnGap = Constants.Value.COLUMN_GAP_NORMAL;
-    private boolean mIsPreCalculateCellWidth =false;
-
-    public int getLayoutType(){
-        return getAttrs().getLayoutType();
-    }
-
-    public float getColumnGap() {
-        return mColumnGap;
-    }
-
-    public int getColumnCount() {
-        return mColumnCount;
-    }
-
-    public float getColumnWidth() {
-        return mColumnWidth;
-    }
-    @Override
-    public void add(WXDomObject child, int index) {
-        super.add(child, index);
-
-        if (WXBasicComponentType.CELL.equals(child.getType())) {
-            if (!mIsPreCalculateCellWidth) {
-                preCalculateCellWidth();
-            }
-            child.getStyles().put(Constants.Name.WIDTH, mColumnWidth);
-        }
-    }
-
-    public void preCalculateCellWidth(){
-
-        if (getAttrs() != null) {
-            mColumnCount = getAttrs().getColumnCount();
-            mColumnWidth = getAttrs().getColumnWidth();
-            mColumnGap =  getAttrs().getColumnGap();
-
-            float availableWidth = getStyleWidth()-getPadding().get(Spacing.LEFT)-getPadding().get(Spacing.RIGHT);
-            availableWidth = WXViewUtils.getWebPxByWidth(availableWidth,getViewPortWidth());
-
-            if (Constants.Value.AUTO == mColumnCount && Constants.Value.AUTO == mColumnWidth) {
-                mColumnCount = Constants.Value.COLUMN_COUNT_NORMAL;
-            } else if (Constants.Value.AUTO == mColumnWidth && Constants.Value.AUTO != mColumnCount) {
-                mColumnWidth = (availableWidth - ((mColumnCount - 1) * mColumnGap)) / mColumnCount;
-                mColumnWidth = mColumnWidth > 0 ? mColumnWidth :0;
-            } else if (Constants.Value.AUTO != mColumnWidth && Constants.Value.AUTO == mColumnCount) {
-                mColumnCount = Math.round((availableWidth + mColumnGap) / (mColumnWidth + mColumnGap)-0.5f);
-                mColumnCount = mColumnCount > 0 ? mColumnCount :1;
-                mColumnWidth =((availableWidth + mColumnGap) / mColumnCount) - mColumnGap;
-            } else if(Constants.Value.AUTO != mColumnWidth && Constants.Value.AUTO != mColumnCount){
-                int columnCount = Math.round((availableWidth + mColumnGap) / (mColumnWidth + mColumnGap)-0.5f);
-                mColumnCount = columnCount > mColumnCount ? mColumnCount :columnCount;
-                mColumnWidth= ((availableWidth + mColumnGap) / mColumnCount) - mColumnGap;
-            }
-            mIsPreCalculateCellWidth = true;
-            if(WXEnvironment.isApkDebugable()) {
-                WXLogUtils.d("preCalculateCellWidth mColumnGap :" + mColumnGap + " mColumnWidth:" + mColumnWidth + " mColumnCount:" + mColumnCount);
-            }
-
-        }
-    }
-
-    public void updateRecyclerAttr(){
-        preCalculateCellWidth();
-        int count = getChildCount();
-        for(int i=0;i<count; i++){
-            WXDomObject domObject = getChild(i);
-            if(WXBasicComponentType.CELL.equals(domObject.getType())) {
-                getChild(i).getStyles().put(Constants.Name.WIDTH, mColumnWidth);
-            }
-        }
-    }
-
-    @Override
-    public void updateAttr(Map<String, Object> attrs) {
-        super.updateAttr(attrs);
-        if(attrs.containsKey(Constants.Name.COLUMN_COUNT)
-                || attrs.containsKey(Constants.Name.COLUMN_GAP)
-                || attrs.containsKey(Constants.Name.COLUMN_WIDTH)){
-            updateRecyclerAttr();
-        }
-    }
-
-    @Override
-    public void updateStyle(Map<String, Object> styles, boolean byPesudo) {
-        super.updateStyle(styles, byPesudo);
-        if(styles.containsKey(Constants.Name.PADDING)
-                ||styles.containsKey(Constants.Name.PADDING_LEFT)
-                || styles.containsKey(Constants.Name.PADDING_RIGHT)){
-            preCalculateCellWidth();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/component/WXBasicComponentType.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXBasicComponentType.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXBasicComponentType.java
index 0d47232..6d8da28 100755
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXBasicComponentType.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXBasicComponentType.java
@@ -218,8 +218,6 @@ public class WXBasicComponentType {
   public static final String SLIDER = "slider";
   public static final String SLIDER_NEIGHBOR = "slider-neighbor";
   public static final String LIST = "list";
-  public static final String RECYCLER = "recycler";
-  public static final String WATERFALL = "waterfall";
   public static final String VLIST = "vlist";
   public static final String HLIST = "hlist";
   public static final String CELL = "cell";

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
index 010dd5a..e988d46 100755
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
@@ -223,9 +223,7 @@ public class WXHeader extends WXCell {
 
   public WXHeader(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) {
     super(instance, node, parent, lazy);
-    if(WXBasicComponentType.LIST.equals((parent.getDomObject().getType()))){
-      setSticky(Constants.Value.STICKY);
-    }
+    setSticky(Constants.Value.STICKY);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
index ccda8d6..142e22f 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
@@ -213,7 +213,6 @@ import android.os.Build;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.util.ArrayMap;
-import android.support.v7.widget.GridLayoutManager;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.StaggeredGridLayoutManager;
@@ -286,12 +285,6 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
   private static boolean mAllowCacheViewHolder = true;
   private static boolean mDownForBidCacheViewHolder = false;
 
-
-  protected int mLayoutType = WXRecyclerView.TYPE_LINEAR_LAYOUT;
-  protected int mColumnCount = 1;
-  protected float mColumnGap = 0;
-  protected float mColumnWidth = 0;
-
   private int mOffsetAccuracy = 10;
   private Point mLastReport = new Point(-1, -1);
 
@@ -321,7 +314,7 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
     int screenH = WXViewUtils.getScreenHeight(WXEnvironment.sApplication);
     int weexH = WXViewUtils.getWeexHeight(getInstanceId());
     int outHeight = height > (weexH >= screenH ? screenH : weexH) ? weexH - getAbsoluteY() : height;
-    return super.measure((int)(width+mColumnGap), outHeight);
+    return super.measure(width, outHeight);
   }
 
   public int getOrientation() {
@@ -685,22 +678,13 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
 
           RecyclerView.LayoutManager layoutManager;
           boolean beforeFirstVisibleItem = false;
-          layoutManager = getHostView().getInnerView().getLayoutManager();
-          if (layoutManager instanceof LinearLayoutManager || layoutManager instanceof GridLayoutManager) {
+          if ((layoutManager = getHostView().getInnerView().getLayoutManager()) instanceof LinearLayoutManager) {
             int fVisible = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition();
             int pos = mChildren.indexOf(cell);
 
             if (pos <= fVisible) {
               beforeFirstVisibleItem = true;
             }
-          } else if(layoutManager instanceof StaggeredGridLayoutManager){
-            int [] firstItems= new int[3];
-            int fVisible = ((StaggeredGridLayoutManager) layoutManager).findFirstVisibleItemPositions(firstItems)[0];
-            int pos = mChildren.indexOf(cell);
-
-            if (pos <= fVisible) {
-              beforeFirstVisibleItem = true;
-            }
           }
 
           int[] location = new int[2];
@@ -944,25 +928,16 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
     }
 
     if (holder.getComponent() != null && holder.getComponent() instanceof WXCell) {
-<<<<<<< HEAD
       if(holder.isRecycled()) {
         holder.bindData(component);
       }
-=======
-      holder.getComponent().bindData(component);
->>>>>>> 0.11-dev-feature-recycler
     }
 
   }
 
-  protected void markComponentUsable(){
-    for (WXComponent component : mChildren){
-      component.setUsing(false);
-    }
-  }
   /**
    * Create an instance of {@link ListBaseViewHolder} for the given viewType (not for the given
-   * index). This  markComponentUsable();method will look up for the first component that fits the viewType requirement and
+   * index). This method will look up for the first component that fits the viewType requirement and
    * doesn't be used. Then create the certain type of view, detach the view f[rom the component.
    *
    * @param parent   the ViewGroup into which the new view will be inserted
@@ -1258,6 +1233,7 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
 
             contentOffset.put(Constants.Name.X, - WXViewUtils.getWebPxByWidth(offsetX, getInstance().getViewPortWidth()));
             contentOffset.put(Constants.Name.Y, - WXViewUtils.getWebPxByWidth(offsetY, getInstance().getViewPortWidth()));
+
             event.put(Constants.Name.CONTENT_SIZE, contentSize);
             event.put(Constants.Name.CONTENT_OFFSET, contentOffset);
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/component/list/ListComponentView.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/ListComponentView.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/ListComponentView.java
index b95ea9e..648c747 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/ListComponentView.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/ListComponentView.java
@@ -204,6 +204,9 @@
  */
 package com.taobao.weex.ui.component.list;
 
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
 import com.taobao.weex.ui.view.listview.WXRecyclerView;
 import com.taobao.weex.ui.view.listview.adapter.RecyclerViewBaseAdapter;
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleListComponent.java
index 36b9ebb..4fb0e80 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleListComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/SimpleListComponent.java
@@ -224,12 +224,8 @@ public class SimpleListComponent extends BasicListComponent<SimpleRecyclerView>{
 
   @Override
   protected SimpleRecyclerView generateListView(Context context, int orientation) {
-    return generateListView(context,WXRecyclerView.TYPE_LINEAR_LAYOUT,orientation);
-  }
-
-  protected SimpleRecyclerView generateListView(Context context, int type,int orientation) {
     SimpleRecyclerView view = new SimpleRecyclerView(context);
-    view.initView(context, type, orientation);
+    view.initView(context, WXRecyclerView.TYPE_LINEAR_LAYOUT, orientation);
     return view;
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
index 7e1d86d..3e68de1 100755
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
@@ -208,24 +208,16 @@ import android.content.Context;
 
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
-import com.taobao.weex.common.Constants;
 import com.taobao.weex.dom.WXDomObject;
-import com.taobao.weex.dom.WXRecyclerDomObject;
-import com.taobao.weex.dom.flex.Spacing;
 import com.taobao.weex.ui.component.WXBaseRefresh;
-import com.taobao.weex.ui.component.WXBasicComponentType;
 import com.taobao.weex.ui.component.WXComponent;
-import com.taobao.weex.ui.component.WXComponentProp;
 import com.taobao.weex.ui.component.WXLoading;
 import com.taobao.weex.ui.component.WXRefresh;
 import com.taobao.weex.ui.component.WXVContainer;
-import com.taobao.weex.ui.view.listview.WXRecyclerView;
 import com.taobao.weex.ui.view.listview.adapter.ListBaseViewHolder;
 import com.taobao.weex.ui.view.refresh.wrapper.BounceRecyclerView;
 import com.taobao.weex.utils.WXLogUtils;
 
-import java.util.Map;
-
 /**
  * Unlike other components, there is immutable bi-directional association between View and
  * ViewHolder, while only mutable and temporal uni-directional association between view and
@@ -237,36 +229,19 @@ import java.util.Map;
 
 public class WXListComponent extends BasicListComponent<BounceRecyclerView> {
   private String TAG = "WXListComponent";
-  private WXRecyclerDomObject mDomObject;
-  private float mPaddingLeft;
-  private float mPaddingRight;
 
   @Deprecated
   public WXListComponent(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) {
     this(instance, dom, parent, isLazy);
   }
 
-
   public WXListComponent(WXSDKInstance instance, WXDomObject node, WXVContainer parent, boolean lazy) {
     super(instance, node, parent);
-    if (node != null && node instanceof WXRecyclerDomObject) {
-      mDomObject = (WXRecyclerDomObject) node;
-      mDomObject.preCalculateCellWidth();
-
-      if(WXBasicComponentType.WATERFALL.equals(node.getType())){
-        mLayoutType = WXRecyclerView.TYPE_STAGGERED_GRID_LAYOUT;
-      }else{
-        mLayoutType = mDomObject.getLayoutType();
-      }
-      updateRecyclerAttr();
-
-    }
   }
 
   @Override
   protected BounceRecyclerView generateListView(Context context, int orientation) {
-
-    return new BounceRecyclerView(context,mLayoutType,mColumnCount,mColumnGap,orientation);
+    return new BounceRecyclerView(context, orientation);
   }
 
   @Override
@@ -311,70 +286,8 @@ public class WXListComponent extends BasicListComponent<BounceRecyclerView> {
       }, 100);
       return true;
     }
-    return false;
-  }
-
-  private void updateRecyclerAttr(){
-    mColumnCount = mDomObject.getColumnCount();
-    mColumnGap = mDomObject.getColumnGap();
-    mColumnWidth = mDomObject.getColumnWidth();
-    mPaddingLeft =mDomObject.getPadding().get(Spacing.LEFT);
-    mPaddingRight =mDomObject.getPadding().get(Spacing.RIGHT);
-  }
-
-  @WXComponentProp(name = Constants.Name.COLUMN_WIDTH)
-  public void setColumnWidth(int columnCount)  {
-    if(mDomObject.getColumnWidth() != mColumnWidth){
-      markComponentUsable();
-      updateRecyclerAttr();
-      WXRecyclerView wxRecyclerView = getHostView().getInnerView();
-      wxRecyclerView.initView(getContext(), mLayoutType,mColumnCount,mColumnGap,getOrientation());
-    }
-  }
-
-  @WXComponentProp(name = Constants.Name.COLUMN_COUNT)
-  public void setColumnCount(int columnCount){
-    if(mDomObject.getColumnCount() != mColumnCount){
-      markComponentUsable();
-      updateRecyclerAttr();
-      WXRecyclerView wxRecyclerView = getHostView().getInnerView();
-      wxRecyclerView.initView(getContext(), mLayoutType,mColumnCount,mColumnGap,getOrientation());
-    }
-  }
-
-  @WXComponentProp(name = Constants.Name.COLUMN_GAP)
-  public void setColumnGap(float columnGap) throws InterruptedException {
-    if(mDomObject.getColumnGap() != mColumnGap) {
-      markComponentUsable();
-      updateRecyclerAttr();
-      WXRecyclerView wxRecyclerView = getHostView().getInnerView();
-      wxRecyclerView.initView(getContext(), mLayoutType, mColumnCount, mColumnGap, getOrientation());
-    }
-  }
-
-  @WXComponentProp(name = Constants.Name.SCROLLABLE)
-  public void setScrollable(boolean scrollable) {
-    WXRecyclerView inner = getHostView().getInnerView();
-    inner.setScrollable(scrollable);
-  }
-
-  @Override
-  public void updateProperties(Map<String, Object> props) {
-    super.updateProperties(props);
-    if(props.containsKey(Constants.Name.PADDING)
-            ||props.containsKey(Constants.Name.PADDING_LEFT)
-            || props.containsKey(Constants.Name.PADDING_RIGHT)){
-
-      if(mPaddingLeft !=mDomObject.getPadding().get(Spacing.LEFT)
-              || mPaddingRight !=mDomObject.getPadding().get(Spacing.RIGHT)) {
-
-        markComponentUsable();
-        updateRecyclerAttr();
-        WXRecyclerView wxRecyclerView = getHostView().getInnerView();
-        wxRecyclerView.initView(getContext(), mLayoutType, mColumnCount, mColumnGap, getOrientation());
-      }
-    }
 
+    return false;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/ExtendedLinearLayoutManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/ExtendedLinearLayoutManager.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/ExtendedLinearLayoutManager.java
index 80feb71..be8afae 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/ExtendedLinearLayoutManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/ExtendedLinearLayoutManager.java
@@ -227,31 +227,6 @@ public class ExtendedLinearLayoutManager extends LinearLayoutManager{
     }
 
     @Override
-    public boolean supportsPredictiveItemAnimations() {
-        return false;
-    }
-
-    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
-        try {
-            super.onLayoutChildren(recycler, state);
-        } catch (IndexOutOfBoundsException e) {
-            e.printStackTrace();
-
-        }
-    }
-
-    @Override
-    public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
-        try {
-            return super.scrollVerticallyBy(dy, recycler, state);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return 0;
-    }
-
-
-    @Override
     public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
                                        int position) {
         if (smoothScroller == null) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/WXRecyclerView.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/WXRecyclerView.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/WXRecyclerView.java
index 4352cfe..fe912af 100755
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/WXRecyclerView.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/WXRecyclerView.java
@@ -204,9 +204,7 @@
  */
 package com.taobao.weex.ui.view.listview;
 
-import android.annotation.TargetApi;
 import android.content.Context;
-import android.os.Build;
 import android.support.annotation.Nullable;
 import android.support.v7.widget.GridLayoutManager;
 import android.support.v7.widget.OrientationHelper;
@@ -214,7 +212,6 @@ import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.StaggeredGridLayoutManager;
 import android.view.MotionEvent;
 
-import com.taobao.weex.common.Constants;
 import com.taobao.weex.common.WXThread;
 import com.taobao.weex.ui.view.gesture.WXGesture;
 import com.taobao.weex.ui.view.gesture.WXGestureObservable;
@@ -225,6 +222,7 @@ public class WXRecyclerView extends RecyclerView implements WXGestureObservable
   public static final int TYPE_GRID_LAYOUT = 2;
   public static final int TYPE_STAGGERED_GRID_LAYOUT = 3;
   private WXGesture mGesture;
+
   private boolean scrollable = true;
 
   public WXRecyclerView(Context context) {
@@ -243,10 +241,6 @@ public class WXRecyclerView extends RecyclerView implements WXGestureObservable
   public boolean postDelayed(Runnable action, long delayMillis) {
     return super.postDelayed(WXThread.secure(action), delayMillis);
   }
-  public void initView(Context context, int type,int orientation) {
-    initView(context,type, Constants.Value.COLUMN_COUNT_NORMAL,Constants.Value.COLUMN_GAP_NORMAL,orientation);
-  }
-
 
   /**
    *
@@ -254,14 +248,39 @@ public class WXRecyclerView extends RecyclerView implements WXGestureObservable
    * @param type
    * @param orientation should be {@link OrientationHelper#HORIZONTAL} or {@link OrientationHelper#VERTICAL}
    */
-  @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
-  public void initView(Context context, int type, int columnCount, float columnGap, int orientation) {
+  public void initView(Context context, int type,int orientation) {
     if (type == TYPE_GRID_LAYOUT) {
-      setLayoutManager(new GridLayoutManager(context, columnCount,orientation,false));
+      setLayoutManager(new GridLayoutManager(context, 2,orientation,false));
     } else if (type == TYPE_STAGGERED_GRID_LAYOUT) {
-      setLayoutManager(new StaggeredGridLayoutManager(columnCount, orientation));
+      setLayoutManager(new StaggeredGridLayoutManager(2, orientation));
     } else if (type == TYPE_LINEAR_LAYOUT) {
-      setLayoutManager(new ExtendedLinearLayoutManager(context,orientation,false));
+      setLayoutManager(new ExtendedLinearLayoutManager(context,orientation,false){
+
+        @Override
+        public boolean supportsPredictiveItemAnimations() {
+          return false;
+        }
+
+        public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
+          try {
+            super.onLayoutChildren(recycler, state);
+          } catch (IndexOutOfBoundsException e) {
+             e.printStackTrace();
+
+          }
+        }
+
+        @Override
+        public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
+          try {
+            return super.scrollVerticallyBy(dy, recycler, state);
+          } catch (Exception e) {
+            e.printStackTrace();
+          }
+          return 0;
+        }
+
+      });
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/ListBaseViewHolder.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/ListBaseViewHolder.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/ListBaseViewHolder.java
index 7ef76bb..903ebd6 100755
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/ListBaseViewHolder.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/ListBaseViewHolder.java
@@ -208,7 +208,6 @@ import android.support.v7.widget.RecyclerView;
 import android.view.View;
 
 import com.taobao.weex.ui.component.WXComponent;
-import com.taobao.weex.ui.component.WXHeader;
 
 import java.lang.ref.WeakReference;
 
@@ -252,11 +251,6 @@ public class ListBaseViewHolder extends RecyclerView.ViewHolder {
       isRecycled = false;
     }
   }
-    
-  public boolean isFullSpan() {
-
-    return mComponent != null && mComponent.get() instanceof WXHeader;
-  }
 
   public boolean canRecycled() {
     if (mComponent != null && mComponent.get() != null) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/RecyclerViewBaseAdapter.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/RecyclerViewBaseAdapter.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/RecyclerViewBaseAdapter.java
index 2b77146..9c89ed1 100755
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/RecyclerViewBaseAdapter.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/RecyclerViewBaseAdapter.java
@@ -205,7 +205,6 @@
 package com.taobao.weex.ui.view.listview.adapter;
 
 import android.support.v7.widget.RecyclerView;
-import android.support.v7.widget.StaggeredGridLayoutManager;
 import android.view.ViewGroup;
 
 
@@ -214,6 +213,7 @@ import android.view.ViewGroup;
  */
 public class RecyclerViewBaseAdapter<T extends ListBaseViewHolder> extends RecyclerView.Adapter<T> {
 
+  private String TAG = "RecyclerViewBaseAdapter";
   private IRecyclerAdapterListener iRecyclerAdapterListener;
 
   public RecyclerViewBaseAdapter(IRecyclerAdapterListener Listener) {
@@ -222,6 +222,7 @@ public class RecyclerViewBaseAdapter<T extends ListBaseViewHolder> extends Recyc
 
   @Override
   public T onCreateViewHolder(ViewGroup parent, int viewType) {
+    //        WXLogUtils.d(TAG, "onCreateViewHolder viewType:" + viewType);
     if (iRecyclerAdapterListener != null) {
       return (T) iRecyclerAdapterListener.onCreateViewHolder(parent, viewType);
     }
@@ -230,21 +231,8 @@ public class RecyclerViewBaseAdapter<T extends ListBaseViewHolder> extends Recyc
   }
 
   @Override
-  public void onViewAttachedToWindow(T holder) {
-    super.onViewAttachedToWindow(holder);
-    if( holder !=null && holder.isFullSpan()){
-      ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
-      if(lp != null
-              && lp instanceof StaggeredGridLayoutManager.LayoutParams
-              ) {
-        StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
-        p.setFullSpan(true);
-      }
-    }
-  }
-
-  @Override
   public void onBindViewHolder(T viewHolder, int i) {
+    //        WXLogUtils.d(TAG, "onBindViewHolder position: " + i);
     if (iRecyclerAdapterListener != null) {
       iRecyclerAdapterListener.onBindViewHolder(viewHolder, i);
     }
@@ -252,6 +240,7 @@ public class RecyclerViewBaseAdapter<T extends ListBaseViewHolder> extends Recyc
 
   @Override
   public int getItemViewType(int position) {
+    //        WXLogUtils.d(TAG, "getItemViewType position:"+position);
     if (iRecyclerAdapterListener != null) {
       return iRecyclerAdapterListener.getItemViewType(position);
     }
@@ -273,6 +262,7 @@ public class RecyclerViewBaseAdapter<T extends ListBaseViewHolder> extends Recyc
 
   @Override
   public void onViewRecycled(T holder) {
+    //        WXLogUtils.d(TAG, "onViewRecycled position ");
     if (iRecyclerAdapterListener != null) {
       iRecyclerAdapterListener.onViewRecycled(holder);
     }
@@ -281,6 +271,7 @@ public class RecyclerViewBaseAdapter<T extends ListBaseViewHolder> extends Recyc
 
   @Override
   public boolean onFailedToRecycleView(T holder) {
+    //        WXLogUtils.d(TAG, "onFailedToRecycleView ");
     if (iRecyclerAdapterListener != null) {
       return iRecyclerAdapterListener.onFailedToRecycleView(holder);
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/WXRecyclerViewOnScrollListener.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/WXRecyclerViewOnScrollListener.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/WXRecyclerViewOnScrollListener.java
index 1cc3dbe..e9e0eb8 100755
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/WXRecyclerViewOnScrollListener.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/listview/adapter/WXRecyclerViewOnScrollListener.java
@@ -225,27 +225,17 @@ public class WXRecyclerViewOnScrollListener extends RecyclerView.OnScrollListene
   /**
    * The last position
    */
-  private int[] mLastPositions;
-  /**
-   * The first position
-   */
-  private int[] mFirstPositions;
-
-
-  /**
-   * The location of last visible item
-   */
-  private int mLastVisibleItemPosition;
+  private int[] lastPositions;
 
   /**
    * The location of last visible item
    */
-  private int mFirstVisibleItemPosition;
+  private int lastVisibleItemPosition;
 
   /**
    * The state of scroll status
    */
-  private int mCurrentScrollState = 0;
+  private int currentScrollState = 0;
 
   private WeakReference<IOnLoadMoreListener> listener;
 
@@ -256,14 +246,14 @@ public class WXRecyclerViewOnScrollListener extends RecyclerView.OnScrollListene
   @Override
   public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
     super.onScrollStateChanged(recyclerView, newState);
-    mCurrentScrollState = newState;
+    currentScrollState = newState;
     RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
     int visibleItemCount = layoutManager.getChildCount();
     int totalItemCount = layoutManager.getItemCount();
 
     if (visibleItemCount != 0) {
-      int bottomOffset = (totalItemCount - mLastVisibleItemPosition - 1) * (recyclerView.getHeight()) / visibleItemCount;
-      if (visibleItemCount > 0 && mCurrentScrollState == RecyclerView.SCROLL_STATE_IDLE) {
+      int bottomOffset = (totalItemCount - lastVisibleItemPosition - 1) * (recyclerView.getHeight()) / visibleItemCount;
+      if (visibleItemCount > 0 && currentScrollState == RecyclerView.SCROLL_STATE_IDLE) {
         if (listener != null && listener.get() != null) {
           listener.get().onLoadMore(bottomOffset);
         }
@@ -276,49 +266,46 @@ public class WXRecyclerViewOnScrollListener extends RecyclerView.OnScrollListene
     super.onScrolled(recyclerView, dx, dy);
     RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
     IOnLoadMoreListener l;
-    if ((l = listener.get()) != null) {
-      l.onBeforeScroll(dx, dy);
+    if((l = listener.get()) != null){
+      l.onBeforeScroll(dx,dy);
     }
 
     //  int lastVisibleItemPosition = -1;
-    if (layoutManager instanceof LinearLayoutManager) {
-      layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR;
-      mLastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
-      listener.get().notifyAppearStateChange(((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition()
-              , mLastVisibleItemPosition
-              , dx
-              , dy);
-    } else if (layoutManager instanceof GridLayoutManager) {
-      layoutManagerType = LAYOUT_MANAGER_TYPE.GRID;
-      GridLayoutManager gridLayoutManager = ((GridLayoutManager) layoutManager);
-      mLastVisibleItemPosition = gridLayoutManager.findLastVisibleItemPosition();
-      listener.get().notifyAppearStateChange(((GridLayoutManager) layoutManager).findFirstVisibleItemPosition()
-              , mLastVisibleItemPosition
-              , dx
-              , dy);
-
-    } else if (layoutManager instanceof StaggeredGridLayoutManager) {
-      layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID;
-      StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
-      int newspanCount = staggeredGridLayoutManager.getSpanCount();
-      if (mLastPositions == null || newspanCount != mLastPositions.length ) {
-        mLastPositions = new int[newspanCount];
+    if (layoutManagerType == null) {
+      if (layoutManager instanceof LinearLayoutManager) {
+        layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR;
+      } else if (layoutManager instanceof GridLayoutManager) {
+        layoutManagerType = LAYOUT_MANAGER_TYPE.GRID;
+      } else if (layoutManager instanceof StaggeredGridLayoutManager) {
+        layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID;
+      } else {
+        throw new RuntimeException(
+            "Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager");
       }
-      if (mFirstPositions == null || newspanCount != mFirstPositions.length) {
-        mFirstPositions = new int[newspanCount];
-      }
-      staggeredGridLayoutManager.findFirstVisibleItemPositions(mFirstPositions);
-      mFirstVisibleItemPosition = findMin(mFirstPositions);
-      staggeredGridLayoutManager.findLastVisibleItemPositions(mLastPositions);
-      mLastVisibleItemPosition = findMax(mLastPositions);
-      listener.get().notifyAppearStateChange(
-              mFirstVisibleItemPosition
-              , mLastVisibleItemPosition
-              , dx
-              , dy);
-    } else {
-      throw new RuntimeException(
-              "Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager");
+    }
+
+    switch (layoutManagerType) {
+      case LINEAR:
+        lastVisibleItemPosition = ((LinearLayoutManager) layoutManager)
+            .findLastVisibleItemPosition();
+        listener.get().notifyAppearStateChange(((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition()
+            ,lastVisibleItemPosition
+            ,dx
+            ,dy);
+        break;
+      case GRID:
+        lastVisibleItemPosition = ((GridLayoutManager) layoutManager)
+            .findLastVisibleItemPosition();
+        break;
+      case STAGGERED_GRID:
+        StaggeredGridLayoutManager staggeredGridLayoutManager
+            = (StaggeredGridLayoutManager) layoutManager;
+        if (lastPositions == null) {
+          lastPositions = new int[staggeredGridLayoutManager.getSpanCount()];
+        }
+        staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions);
+        lastVisibleItemPosition = findMax(lastPositions);
+        break;
     }
   }
 
@@ -332,16 +319,6 @@ public class WXRecyclerViewOnScrollListener extends RecyclerView.OnScrollListene
     return max;
   }
 
-  private int findMin(int[] firstPositions) {
-    int min = firstPositions[0];
-    for (int value : firstPositions) {
-      if (value < min) {
-        min = value;
-      }
-    }
-    return min;
-  }
-
   public enum LAYOUT_MANAGER_TYPE {
     LINEAR,
     GRID,

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BaseBounceView.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BaseBounceView.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BaseBounceView.java
index e6054bf..1809a78 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BaseBounceView.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BaseBounceView.java
@@ -230,22 +230,23 @@ public abstract class BaseBounceView<T extends View> extends FrameLayout {
 
     private int mOrientation = OrientationHelper.VERTICAL;
     protected WXSwipeLayout swipeLayout;
-    private T mInnerView;
+    private T innerView;
 
     public BaseBounceView(Context context,int orientation) {
         this(context, null,orientation);
     }
 
-    public BaseBounceView(Context context, AttributeSet attrs,int orientation) {
+    public BaseBounceView(Context context, AttributeSet attrs,int orientataion) {
         super(context, attrs);
-        mOrientation = orientation;
+        mOrientation = orientataion;
+        init(context);
     }
 
     public int getOrientation(){
         return mOrientation;
     }
 
-    public void init(Context context) {
+    private void init(Context context) {
         createBounceView(context);
     }
 
@@ -274,15 +275,15 @@ public abstract class BaseBounceView<T extends View> extends FrameLayout {
     }
 
     /**
-     * Init wipelayout
+     * Init Swipelayout
      */
     private WXSwipeLayout createBounceView(Context context) {
         swipeLayout = new WXSwipeLayout(context);
         swipeLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
-        mInnerView = setInnerView(context);
-        if (mInnerView == null)
+        innerView = setInnerView(context);
+        if (innerView == null)
             return null;
-        swipeLayout.addView(mInnerView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
+        swipeLayout.addView(innerView, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));
         addView(swipeLayout, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
         return swipeLayout;
     }
@@ -291,7 +292,7 @@ public abstract class BaseBounceView<T extends View> extends FrameLayout {
      * @return the child of swipelayout : recyclerview or scrollview
      */
     public T getInnerView() {
-        return mInnerView;
+        return innerView;
     }
 
     public abstract T setInnerView(Context context);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceRecyclerView.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceRecyclerView.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceRecyclerView.java
index abbdf0d..2d81b37 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceRecyclerView.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceRecyclerView.java
@@ -206,6 +206,8 @@ package com.taobao.weex.ui.view.refresh.wrapper;
 
 import android.content.Context;
 import android.support.annotation.Nullable;
+import android.support.v7.widget.OrientationHelper;
+import android.util.AttributeSet;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
@@ -221,33 +223,24 @@ import com.taobao.weex.ui.view.listview.adapter.RecyclerViewBaseAdapter;
 
 import java.util.Stack;
 
-
 public class BounceRecyclerView extends BaseBounceView<WXRecyclerView> implements ListComponentView,WXGestureObservable {
 
   private RecyclerViewBaseAdapter adapter = null;
   private Stack<View> headerViewStack = new Stack<>();
   private Stack<WXCell> headComponentStack = new Stack<>();
   private WXGesture mGesture;
-  private int mLayoutType = WXRecyclerView.TYPE_LINEAR_LAYOUT;
-  private int mColumnCount = 1;
-  private float mColumnGap = 1;
 
   @Override
   public boolean postDelayed(Runnable action, long delayMillis) {
     return super.postDelayed(WXThread.secure(action), delayMillis);
   }
 
-  public BounceRecyclerView(Context context,int type,int columnCount,float columnGap,int orientation) {
+  public BounceRecyclerView(Context context, int orientation) {
     super(context, orientation);
-    mLayoutType = type;
-    mColumnCount = columnCount;
-    mColumnGap = columnGap;
-    init(context);
   }
-  public BounceRecyclerView(Context context,int type,int orientation) {
-    super(context, orientation);
-    mLayoutType = type;
-    init(context);
+
+  public BounceRecyclerView(Context context, AttributeSet attrs) {
+    super(context, attrs, OrientationHelper.VERTICAL);
   }
 
   public void setRecyclerViewBaseAdapter(RecyclerViewBaseAdapter adapter) {
@@ -269,11 +262,11 @@ public class BounceRecyclerView extends BaseBounceView<WXRecyclerView> implement
     }
     return result;
   }
-
+    
   @Override
   public WXRecyclerView setInnerView(Context context) {
     WXRecyclerView wxRecyclerView = new WXRecyclerView(context);
-    wxRecyclerView.initView(context, mLayoutType,mColumnCount,mColumnGap,getOrientation());
+    wxRecyclerView.initView(context, WXRecyclerView.TYPE_LINEAR_LAYOUT, getOrientation());
     return wxRecyclerView;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceScrollerView.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceScrollerView.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceScrollerView.java
index 7d8a990..cc30556 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceScrollerView.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/refresh/wrapper/BounceScrollerView.java
@@ -219,7 +219,6 @@ public class BounceScrollerView extends BaseBounceView<WXScrollView> {
 
     public BounceScrollerView(Context context, int orientation, WXScroller waScroller) {
         super(context,orientation);
-        init(context);
         if (getInnerView() != null)
             getInnerView().setWAScroller(waScroller);
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/examples/vue/components/waterfall.vue
----------------------------------------------------------------------
diff --git a/examples/vue/components/waterfall.vue b/examples/vue/components/waterfall.vue
deleted file mode 100644
index 7bf42f9..0000000
--- a/examples/vue/components/waterfall.vue
+++ /dev/null
@@ -1,455 +0,0 @@
-<template>
-  <waterfall class="page"
-  v-bind:style="{padding:padding}"
-  :column-width="columnWidth" :column-count="columnCount" :column-gap="columnGap"
-  :show-scrollbar="showScrollbar" :scrollable="scrollable"
-  @scroll="recylerScroll"
-  >
-    <refresh class="refresh" @refresh="onrefresh" @pullingdown="onpullingdown" :display="refreshing ? 'show' : 'hide'">
-      <loading-indicator class="indicator"></loading-indicator>
-      <text class="refreshText">{{refreshText}}</text>
-    </refresh>
-    <header class="header" ref="header" v-if="showHeader">
-      <image class="banner" src="https://gw.alicdn.com/tps/TB1ESN1PFXXXXX1apXXXXXXXXXX-1000-600.jpg" resize="cover">
-        <div class="bannerInfo">
-          <image class="avatar" src="https://gw.alicdn.com/tps/TB1EP9bPFXXXXbpXVXXXXXXXXXX-150-110.jpg" resize="cover"></image>
-          <text class="name">Adam Cat</text>
-          <div class="titleWrap">
-            <text class="title">Genius</text>
-          </div>
-        </div>
-        <div class="bannerPhotoWrap">
-          <image class="bannerPhoto" v-for="photo in banner.photos" :src="photo.src"></image>
-        </div>
-      </image>
-    </header>
-    <header class="stickyHeader" @click="showOrRemoveHeader">
-      <div v-if="stickyHeaderType === 'none'" class="stickyWrapper">
-        <text class="stickyText">Sticky Header</text>
-      </div>
-      <div v-if="stickyHeaderType === 'appear'" class="stickyWrapper">
-        <div class="stickyTextImageWrapper">
-          <text class="stickyText">Last Appear:</text>
-          <image class="stickyImage" :src="appearImage"></image>
-        </div>
-        <div class="stickyTextImageWrapper">
-          <text class="stickyText">Last Disappear:</text>
-          <image class="stickyImage" :src="disappearImage"></image>
-        </div>
-      </div>
-      <div v-if="stickyHeaderType === 'scroll'" class="stickyWrapper">
-        <text class="stickyText">Content Offset:{{contentOffset}}</text>
-      </div>
-    </header>
-    <cell v-for="(item, index) in items" :key="item.src" class="cell">
-      <div class="item" @click="onItemclick(item.behaviour, index)" @appear="itemAppear(item.src)" @disappear="itemDisappear(item.src)">
-        <text v-if="item.name" class="itemName">{{item.name}}</text>
-        <image class="itemPhoto" :src="item.src"></image>
-        <text v-if="item.desc" class="itemDesc">{{item.desc}}</text>
-        <text v-if="item.behaviourName" class="itemClickBehaviour"> {{item.behaviourName}}</text>
-      </div>
-    </cell>
-    <div class="fixedItem" @click="scrollToTop">
-      <text class="fixedText">Top</text>
-    </div>
-  </waterfall>
-</template>
-
-<style>
-  .page {
-    background-color: #EFEFEF;
-  }
-  .refresh {
-    height: 128;
-    width: 750;
-    flex-direction: row;
-    align-items: center;
-    justify-content: center;
-  }
-  .refreshText {
-    color: #888888;
-    font-weight: bold;
-  }
-  .indicator {
-    color: #888888;
-    height: 40;
-    width: 40;
-    margin-right: 30;
-  }
-  .header {
-  }
-  .banner {
-    height: 377;
-    flex-direction: row;
-  }
-  .bannerInfo {
-    width:270;
-    align-items: center;
-    justify-content: center;
-  }
-  .avatar {
-    width: 148;
-    height: 108;
-    border-radius: 54;
-    border-width: 4;
-    border-color: #FFFFFF;
-    margin-bottom: 14;
-  }
-  .name {
-    font-weight: bold;
-    font-size:32;
-    color:#ffffff;
-    line-height:32;
-    text-align:center;
-    margin-bottom: 16;
-  }
-  .titleWrap {
-    width: 100;
-    height: 24;
-    margin-bottom: 10;
-    background-color: rgba(255,255,255,0.80);
-    border-radius: 12;
-    justify-content: center;
-    align-items: center;
-  }
-  .title {
-    font-size: 20;
-    color: #000000;
-  }
-  .bannerPhotoWrap {
-    width: 449;
-    height: 305;
-    background-color: #FFFFFF;
-    border-radius: 12;
-    margin-top: 35;
-    padding: 12;
-    flex-direction: row;
-    justify-content: space-between;
-    flex-wrap:wrap;
-  }
-  .bannerPhoto {
-    width: 137;
-    height: 137;
-    margin-bottom: 6;
-  }
-  .stickyHeader {
-    position: sticky;
-    height: 94;
-    flex-direction: row;
-    padding-bottom:6;
-  }
-  .stickyWrapper {
-    flex-direction: row;
-    background-color:#00cc99;
-    justify-content: center;
-    align-items: center;
-    flex:1;
-  }
-  .stickyTextImageWrapper {
-    flex:1;
-    justify-content: center;
-    align-items: center;
-    flex-direction: row;
-  }
-  .stickyText {
-    color: #FFFFFF;
-    font-weight: bold;
-    font-size:32;
-    margin-right: 12;
-  }
-  .stickyImage {
-    width: 64;
-    height: 64;
-    border-radius: 32;
-  }
-
-  .cell {
-    padding-top: 6;
-    padding-bottom: 6;
-  }
-  .item {
-    background-color: #FFFFFF;
-    align-items: center;
-  }
-  .itemName {
-    font-size:28;
-    color:#333333;
-    line-height:42;
-    text-align:left;
-    margin-top: 24;
-  }
-  .itemPhoto {
-    margin-top: 18;
-    width: 220;
-    height: 220;
-    margin-bottom: 18;
-  }
-  .itemDesc {
-    font-size:24;
-    margin:12;
-    color:#999999;
-    line-height:36;
-    text-align:left;
-  }
-  .itemClickBehaviour {
-    font-size:36;
-    color:#00cc99;
-    line-height:36;
-    text-align:center;
-    margin-top: 6;
-    margin-left: 24;
-    margin-right: 24;
-    margin-bottom: 30;
-  }
-
-  .fixedItem {
-    position: fixed;
-    width:78;
-    height:78;
-    background-color:#00cc99;
-    right: 32;
-    bottom: 32;
-    border-radius: 39;
-    align-items: center;
-    justify-content: center;
-  }
-  .fixedText {
-    font-size: 36;
-    color: white;
-    line-height: 36;
-  }
-
-</style>
-
-<script>
-  export default {
-    data: function() {
-      const items = [
-        {
-          src:'https://gw.alicdn.com/tps/TB1Jl1CPFXXXXcJXXXXXXXXXXXX-370-370.jpg',
-          name: 'Thomas Carlyle',
-          desc:'Genius only means hard-working all one\'s life',
-          behaviourName: 'Change count',
-          behaviour: 'changeColumnCount'
-        },
-        {
-          src:'https://gw.alicdn.com/tps/TB1Hv1JPFXXXXa3XXXXXXXXXXXX-370-370.jpg',
-          desc:'The man who has made up his mind to win will never say "impossible "',
-          behaviourName: 'Change gap',
-          behaviour: 'changeColumnGap'
-        },
-        {
-          src:'https://gw.alicdn.com/tps/TB1eNKuPFXXXXc_XpXXXXXXXXXX-370-370.jpg',
-          desc:'There is no such thing as a great talent without great will - power',
-          behaviourName: 'Show scrollbar',
-          behaviour: 'showScrollbar',
-        },
-        {
-          src:'https://gw.alicdn.com/tps/TB1DCh8PFXXXXX7aXXXXXXXXXXX-370-370.jpg',
-          name:'Addison',
-          desc:'Cease to struggle and you cease to live',
-          behaviourName: 'Change width',
-          behaviour: 'changeColumnWidth',
-        },
-        {
-          src:'https://gw.alicdn.com/tps/TB1ACygPFXXXXXwXVXXXXXXXXXX-370-370.jpg',
-          desc:'A strong man will struggle with the storms of fate',
-          behaviourName: 'Listen appear',
-          behaviour: 'listenAppear',
-        },
-        {
-          src:'https://gw.alicdn.com/tps/TB1IGShPFXXXXaqXVXXXXXXXXXX-370-370.jpg',
-          name:'Ruskin',
-          desc:'Living without an aim is like sailing without a compass',
-          behaviourName: 'Set scrollable',
-          behaviour: 'setScrollable',
-        },
-        {
-          src:'https://gw.alicdn.com/tps/TB1xU93PFXXXXXHaXXXXXXXXXXX-240-240.jpg',
-          behaviourName: 'waterfall padding',
-          behaviour: 'setPadding',
-        },
-        {
-          src:'https://gw.alicdn.com/tps/TB19hu0PFXXXXaXaXXXXXXXXXXX-240-240.jpg',
-          name:'Balzac',
-          desc:'There is no such thing as a great talent without great will - power',
-          behaviourName: 'listen scroll',
-          behaviour: 'listenScroll',
-        },
-        {
-          src:'https://gw.alicdn.com/tps/TB1ux2vPFXXXXbkXXXXXXXXXXXX-240-240.jpg',
-          behaviourName: 'Remove cell',
-          behaviour: 'removeCell',
-        },
-        {
-          src:'https://gw.alicdn.com/tps/TB1tCCWPFXXXXa7aXXXXXXXXXXX-240-240.jpg',
-          behaviourName: 'Move cell',
-          behaviour: 'moveCell',
-        }
-      ]
-
-      let repeatItems = [];
-      for (let i = 0; i < 3; i++) {
-        repeatItems.push(...items)
-      }
-
-      return {
-        padding: 0,
-        refreshing: false,
-        refreshText: '\u2193   pull to refresh...',
-        columnCount: 2,
-        columnGap: 12,
-        columnWidth: 'auto',
-        contentOffset: '0',
-        showHeader: true,
-        showScrollbar: false,
-        scrollable: true,
-        showStickyHeader: false,
-        appearImage: null,
-        disappearImage: null,
-        stickyHeaderType: 'none',
-        banner: {
-          photos: [
-            {src:'https://gw.alicdn.com/tps/TB1JyaCPFXXXXc9XXXXXXXXXXXX-140-140.jpg'},
-            {src:'https://gw.alicdn.com/tps/TB1MwSFPFXXXXbdXXXXXXXXXXXX-140-140.jpg'},
-            {src:'https://gw.alicdn.com/tps/TB1U8avPFXXXXaDXpXXXXXXXXXX-140-140.jpg'},
-            {src:'https://gw.alicdn.com/tps/TB17Xh8PFXXXXbkaXXXXXXXXXXX-140-140.jpg'},
-            {src:'https://gw.alicdn.com/tps/TB1cTmLPFXXXXXRXXXXXXXXXXXX-140-140.jpg'},
-            {src:'https://gw.alicdn.com/tps/TB1oCefPFXXXXbVXVXXXXXXXXXX-140-140.jpg'}
-          ]
-        },
-        items: repeatItems
-      }
-    },
-
-    methods: {
-      recylerScroll: function(e) {
-        this.contentOffset = e.contentOffset.y
-      },
-      showOrRemoveHeader: function() {
-        this.showHeader = !this.showHeader
-      },
-      onItemclick: function (behaviour, index) {
-        console.log(`click...${behaviour} at index ${index}`)
-        switch (behaviour) {
-          case 'changeColumnCount':
-            this.changeColumnCount()
-            break
-          case 'changeColumnGap':
-            this.changeColumnGap()
-            break
-          case 'changeColumnWidth':
-            this.changeColumnWidth()
-            break
-          case 'showScrollbar':
-            this.showOrHideScrollbar()
-            break
-          case 'listenAppear':
-            this.listenAppearAndDisappear()
-            break
-          case 'setScrollable':
-            this.setScrollable()
-            break
-          case 'setPadding':
-            this.setRecyclerPadding()
-            break
-          case 'listenScroll':
-            this.listenScrollEvent()
-            break
-          case 'removeCell':
-            this.removeCell(index)
-            break
-          case 'moveCell':
-            this.moveCell(index)
-            break
-        }
-      },
-
-      itemAppear: function(src) {
-        this.appearImage = src;
-      },
-
-      itemDisappear: function(src) {
-        this.disappearImage = src;
-      },
-
-      changeColumnCount: function() {
-        if (this.columnCount === 2) {
-          this.columnCount = 3
-        } else {
-          this.columnCount = 2
-        }
-      },
-
-      changeColumnGap: function() {
-        if (this.columnGap === 12) {
-          this.columnGap = 'normal'
-        } else {
-          this.columnGap = 12
-        }
-      },
-
-      changeColumnWidth: function() {
-        if (this.columnWidth === 'auto') {
-          this.columnWidth = 600
-        } else {
-          this.columnWidth = 'auto'
-        }
-      },
-
-      showOrHideScrollbar: function() {
-        this.showScrollbar = !this.showScrollbar
-      },
-
-      setScrollable: function() {
-        this.scrollable = !this.scrollable
-      },
-
-      listenAppearAndDisappear: function() {
-        this.stickyHeaderType = (this.stickyHeaderType === 'appear' ? 'none' : 'appear')
-      },
-
-      listenScrollEvent: function() {
-        this.stickyHeaderType = (this.stickyHeaderType === 'scroll' ? 'none' : 'scroll')
-      },
-
-      scrollToTop: function() {
-        weex.requireModule('dom').scrollToElement(this.$refs.header)
-      },
-
-      setRecyclerPadding: function() {
-        this.padding = (this.padding == 0 ? 12 : 0);
-      },
-
-      removeCell: function(index) {
-        this.items.splice(index, 1)
-      },
-
-      moveCell: function(index) {
-        if (index == 0) {
-          this.items.splice(this.items.length - 1, 0, this.items.splice(index, 1)[0]);
-        } else {
-          this.items.splice(0, 0, this.items.splice(index, 1)[0]);
-        }
-      },
-
-      onrefresh (event) {
-        this.refreshing = true
-        this.refreshText = "loading..."
-        setTimeout(() => {
-          this.refreshing = false
-          this.refreshText = '\u2193   pull to refresh...'
-        }, 2000)
-      },
-
-      onpullingdown (event) {
-        // console.log(`${event.pullingDistance}`)
-        if (event.pullingDistance < -64) {
-          this.refreshText = '\u2191   release to refresh...'
-        } else {
-          this.refreshText = '\u2193   pull to refresh...'
-        }
-      }
-    }
-  }
-</script>

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/examples/vue/index.vue
----------------------------------------------------------------------
diff --git a/examples/vue/index.vue b/examples/vue/index.vue
index dffc5f3..80af3b8 100644
--- a/examples/vue/index.vue
+++ b/examples/vue/index.vue
@@ -19,7 +19,6 @@
           {name: root + '/components/input', title: 'Input'},
           {name: root + '/components/scroller', title: 'Scroller'},
           {name: root + '/components/list', title: 'List'},
-          {name: root + '/components/waterfall', title: 'Waterfall'},
           {name: root + '/components/slider', title: 'Slider'},
           {name: root + '/components/a', title: 'A'},
           {name: root + '/components/video', title: 'Video'},

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/ios/playground/Podfile
----------------------------------------------------------------------
diff --git a/ios/playground/Podfile b/ios/playground/Podfile
index c7be756..c8d1d35 100644
--- a/ios/playground/Podfile
+++ b/ios/playground/Podfile
@@ -1,4 +1,4 @@
-source 'git@github.com:CocoaPods/Specs.git'
+source 'git@github.com/CocoaPods/Specs.git'
 platform :ios, '7.0'
 #inhibit_all_warnings!
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/ios/playground/WeexDemo/DemoDefine.h
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/DemoDefine.h b/ios/playground/WeexDemo/DemoDefine.h
index fe07a7b..478ecb5 100644
--- a/ios/playground/WeexDemo/DemoDefine.h
+++ b/ios/playground/WeexDemo/DemoDefine.h
@@ -18,7 +18,7 @@
 
 #define DEMO_URL(path) [NSString stringWithFormat:@"http://%@:12580/%s", DEMO_HOST, #path]
 
-#define HOME_URL [NSString stringWithFormat:@"http://%@:12580/examples/build/vue/index.js", DEMO_HOST]
+#define HOME_URL [NSString stringWithFormat:@"http://%@:12580/examples/build/index.js", DEMO_HOST]
 
 #define BUNDLE_URL [NSString stringWithFormat:@"file://%@/bundlejs/index.js",[NSBundle mainBundle].bundlePath]
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/ios/playground/WeexDemo/UIView+UIThreadCheck.m
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/UIView+UIThreadCheck.m b/ios/playground/WeexDemo/UIView+UIThreadCheck.m
index 579eab9..e499f53 100644
--- a/ios/playground/WeexDemo/UIView+UIThreadCheck.m
+++ b/ios/playground/WeexDemo/UIView+UIThreadCheck.m
@@ -10,7 +10,7 @@
 #import <WeexSDK/NSObject+WXSwizzle.h>
 
 #define WXCheckUIThread() NSAssert([NSThread isMainThread], \
-@"You must change UI on main thread!")
+@"You can not change UI on main thread!")
 
 @implementation UIView (UIThreadCheck)
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/3621001f/ios/playground/WeexDemo/WXDemoViewController.m
----------------------------------------------------------------------
diff --git a/ios/playground/WeexDemo/WXDemoViewController.m b/ios/playground/WeexDemo/WXDemoViewController.m
index f962df0..d354078 100644
--- a/ios/playground/WeexDemo/WXDemoViewController.m
+++ b/ios/playground/WeexDemo/WXDemoViewController.m
@@ -94,8 +94,7 @@
 - (void)dealloc
 {
     [_instance destroyInstance];
-    
-#ifdef DEBUG
+#if DEBUG
     [_instance forceGarbageCollection];
 #endif