sticky improve
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/b3f5d314 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/b3f5d314 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/b3f5d314 Branch: refs/heads/0.16-dev Commit: b3f5d31451fa98e518e19c12a609a105757ba7be Parents: 7fc24df Author: jianbai.gbj <jianbai....@alibaba-inc.com> Authored: Thu Sep 14 22:23:11 2017 +0800 Committer: jianbai.gbj <jianbai....@alibaba-inc.com> Committed: Thu Sep 14 22:23:11 2017 +0800 ---------------------------------------------------------------------- .../list/template/TemplateStickyHelper.java | 44 +++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b3f5d314/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/TemplateStickyHelper.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/TemplateStickyHelper.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/TemplateStickyHelper.java index a537c94..d768f32 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/TemplateStickyHelper.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/TemplateStickyHelper.java @@ -58,11 +58,14 @@ public class TemplateStickyHelper { RecyclerView recyclerView = recyclerTemplateList.getHostView().getInnerView(); RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); int firstVisiblePosition = -1; + int lastVisiblePosition = -1; if (layoutManager instanceof LinearLayoutManager) { firstVisiblePosition = ((LinearLayoutManager) layoutManager).findFirstVisibleItemPosition(); + lastVisiblePosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition(); }else if (layoutManager instanceof StaggeredGridLayoutManager) { int [] firstVisibleItemPositions = new int[3];//max 3 column firstVisiblePosition = ((StaggeredGridLayoutManager) layoutManager).findFirstVisibleItemPositions(firstVisibleItemPositions)[0]; + lastVisiblePosition = ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(firstVisibleItemPositions)[0]; } if(firstVisiblePosition < 0){ return; @@ -98,6 +101,22 @@ public class TemplateStickyHelper { stickyFakeViewHolder.getComponent().fireEvent(Constants.Event.UNSTICKY); } } + + /**check has sticky cell not visible */ + for(int i=0; i<recyclerView.getChildCount(); i++) { + View itemView = recyclerView.getChildAt(i); + TemplateViewHolder itemHolder = (TemplateViewHolder) recyclerView.getChildViewHolder(itemView); + if (itemHolder == null) { + continue; + } + int adapterPosition = itemHolder.getAdapterPosition(); + if (!stickyPositions.contains(adapterPosition)) { + continue; + } + if(itemView.getVisibility() != View.VISIBLE) { + itemView.setVisibility(View.VISIBLE); + } + } return; } @@ -120,16 +139,23 @@ public class TemplateStickyHelper { } //create new sticky - TemplateViewHolder fakeStickyHolder = stickyHolderCache.get(matchStickyPosition); - if(fakeStickyHolder == null || fakeStickyHolder.getItemViewType() != recyclerTemplateList.getItemViewType(matchStickyPosition)){ - fakeStickyHolder = recyclerTemplateList.onCreateViewHolder(recyclerView, recyclerTemplateList.getItemViewType(matchStickyPosition)); - stickyHolderCache.put(matchStickyPosition, fakeStickyHolder); + int stickyHolderType = recyclerTemplateList.getItemViewType(matchStickyPosition); + TemplateViewHolder fakeStickyHolder = stickyHolderCache.get(stickyHolderType); + if(fakeStickyHolder == null){ + fakeStickyHolder = recyclerTemplateList.onCreateViewHolder(recyclerView, stickyHolderType); + stickyHolderCache.put(stickyHolderType, fakeStickyHolder); + }else{ + fakeStickyHolder.getComponent().recycled(); } recyclerTemplateList.onBindViewHolder(fakeStickyHolder, matchStickyPosition); fakeStickyHolder.itemView.setTranslationY(0); fakeStickyHolder.itemView.setTag(fakeStickyHolder); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); fakeStickyHolder.getComponent().clearPreLayout(); + if(fakeStickyHolder.itemView.getParent() != null){ + ViewGroup parent = (ViewGroup) fakeStickyHolder.itemView.getParent(); + parent.removeView(fakeStickyHolder.itemView); + } bounceRecyclerView.addView(fakeStickyHolder.itemView, params); fakeStickyHolder.getComponent().setLayout(fakeStickyHolder.getComponent().getDomObject()); stickyFakeView = fakeStickyHolder.itemView; @@ -184,8 +210,16 @@ public class TemplateStickyHelper { } } - //handle sticky is related + //handle sticky is related, find next sticky position on screen int nextVisiblePostion = firstVisiblePosition + 1; + if(lastVisiblePosition > 0){ + for(int i=nextVisiblePostion; i<= lastVisiblePosition; i++){ + if(stickyPositions.contains(i)){ + nextVisiblePostion = i; + break; + } + } + } if(!stickyPositions.contains(nextVisiblePostion)){ if(stickyFakeViewHolder.itemView.getTranslationY() < 0){ stickyFakeViewHolder.itemView.setTranslationY(0);