From cc9ca194701c3e2b063fb1e6e6f56e93d9ebcb60 Mon Sep 17 00:00:00 2001 From: sospartan Date: Mon, 3 Jul 2017 16:47:25 +0800 Subject: [PATCH] * [android] change 'contentSize' value in list 'scroll' event, use value caculate by layout engine. @not-danger --- .../taobao/weex/ui/component/WXComponent.java | 8 +++ .../ui/component/list/BasicListComponent.java | 57 +++++++++++++------ .../taobao/weex/ui/component/list/WXCell.java | 9 +++ 3 files changed, 58 insertions(+), 16 deletions(-) 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 730d6dac76..409977823d 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 @@ -499,6 +499,14 @@ protected void onFinishLayout() { } } + public float getLayoutWidth(){ + return mDomObj == null ? 0 : mDomObj.getLayoutWidth(); + } + + public float getLayoutHeight(){ + return mDomObj == null ? 0 : mDomObj.getLayoutHeight(); + } + public void setPadding(Spacing padding, Spacing border) { int left = (int) (padding.get(Spacing.LEFT) + border.get(Spacing.LEFT)); int top = (int) (padding.get(Spacing.TOP) + border.get(Spacing.TOP)); 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 306be55ef8..f3f6ac6438 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 @@ -133,6 +133,16 @@ public abstract class BasicListComponent args) { mTriggerType = getTriggerType(getDomObject()); } + @Override + protected void onFinishLayout() { + super.onFinishLayout(); + recalculateSize(); + } + /** * Measure the size of the recyclerView. * @@ -1254,28 +1270,37 @@ public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } if (shouldReport(offsetX, offsetY)) { - int contentWidth = recyclerView.getMeasuredWidth() + recyclerView.computeHorizontalScrollRange(); - int contentHeight = recyclerView.computeVerticalScrollRange(); - - Map event = new HashMap<>(2); - Map contentSize = new HashMap<>(2); - Map contentOffset = new HashMap<>(2); - - contentSize.put(Constants.Name.WIDTH, WXViewUtils.getWebPxByWidth(contentWidth, getInstance().getInstanceViewPortWidth())); - contentSize.put(Constants.Name.HEIGHT, WXViewUtils.getWebPxByWidth(contentHeight, getInstance().getInstanceViewPortWidth())); - - contentOffset.put(Constants.Name.X, - WXViewUtils.getWebPxByWidth(offsetX, getInstance().getInstanceViewPortWidth())); - contentOffset.put(Constants.Name.Y, - WXViewUtils.getWebPxByWidth(offsetY, getInstance().getInstanceViewPortWidth())); - event.put(Constants.Name.CONTENT_SIZE, contentSize); - event.put(Constants.Name.CONTENT_OFFSET, contentOffset); - - fireEvent(Constants.Event.SCROLL, event); + fireScrollEvent(offsetX, offsetY); } } }); } } + private void fireScrollEvent(int offsetX, int offsetY){ + ListComponentView view = getHostView(); + if(view == null){ + return; + } + WXRecyclerView innerView = view.getInnerView(); + int contentWidth = innerView.getMeasuredWidth() + innerView.computeHorizontalScrollRange(); + int contentHeight = (int)mContentHeight; + + Map event = new HashMap<>(2); + Map contentSize = new HashMap<>(2); + Map contentOffset = new HashMap<>(2); + + contentSize.put(Constants.Name.WIDTH, WXViewUtils.getWebPxByWidth(contentWidth, getInstance().getInstanceViewPortWidth())); + contentSize.put(Constants.Name.HEIGHT, WXViewUtils.getWebPxByWidth(contentHeight, getInstance().getInstanceViewPortWidth())); + + contentOffset.put(Constants.Name.X, - WXViewUtils.getWebPxByWidth(offsetX, getInstance().getInstanceViewPortWidth())); + contentOffset.put(Constants.Name.Y, - WXViewUtils.getWebPxByWidth(offsetY, getInstance().getInstanceViewPortWidth())); + event.put(Constants.Name.CONTENT_SIZE, contentSize); + event.put(Constants.Name.CONTENT_OFFSET, contentOffset); + + fireEvent(Constants.Event.SCROLL, event); + } + private boolean shouldReport(int offsetX, int offsetY) { if (mLastReport.x == -1 && mLastReport.y == -1) { mLastReport.x = offsetX; diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java index 0bf7b92023..172f19b298 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXCell.java @@ -83,6 +83,15 @@ protected WXFrameLayout initComponentHostView(@NonNull Context context) { } } + @Override + protected void onFinishLayout() { + super.onFinishLayout(); + WXVContainer container = getParent(); + if(container != null && container instanceof BasicListComponent){ + ((BasicListComponent)container).recalculateSize(); + } + } + public int getLocationFromStart(){ return mLastLocationY; }