diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/hippylist/HippyRecyclerView.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/hippylist/HippyRecyclerView.java index a2be91b24bb..60e66bf913c 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/hippylist/HippyRecyclerView.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/hippylist/HippyRecyclerView.java @@ -20,6 +20,7 @@ import android.content.Context; import android.graphics.Rect; +import android.util.Log; import android.view.ViewConfiguration; import android.widget.FrameLayout; import androidx.annotation.NonNull; @@ -49,6 +50,7 @@ public class HippyRecyclerView extends HippyRecyclerViewBase implements IHeaderAttachListener, HippyViewHolderAbandonListener, HippyNestedScrollTarget2 { + private static final String TAG = "HippyRecyclerView"; private static int DEFAULT_ITEM_VIEW_CACHE_SIZE = 4; private static final int INVALID_POINTER = -1; protected ADP listAdapter; @@ -253,10 +255,19 @@ private void scrollToInitContentOffset() { * 刷新数据 */ public void setListData() { - LogUtils.d("HippyRecyclerView", "itemCount =" + listAdapter.getItemCount()); LayoutManager layoutManager = getLayoutManager(); + int currentNodeCount = listAdapter.getRenderNodeCount(); if (layoutManager instanceof StaggeredGridLayoutManager) { - listAdapter.notifyItemRangeChanged(renderNodeCount, listAdapter.getRenderNodeCount() - renderNodeCount); + LogUtils.d(TAG, "setListData: lastNodeCount " + renderNodeCount + ", currentNodeCount " + currentNodeCount); + int[] firstVisibleItem = null; + firstVisibleItem = ((HippyStaggeredGridLayoutManager) layoutManager).findFirstVisibleItemPositions(firstVisibleItem); + if (renderNodeCount >= currentNodeCount && firstVisibleItem != null + && (firstVisibleItem[0] == 0 || firstVisibleItem[0] == 1)) { + LogUtils.d(TAG, "setListData: firstVisibleItem[0] " + firstVisibleItem[0]); + listAdapter.notifyDataSetChanged(); + } else if (renderNodeCount < currentNodeCount) { + listAdapter.notifyItemRangeInserted(renderNodeCount, listAdapter.getRenderNodeCount() - renderNodeCount); + } } else { listAdapter.notifyDataSetChanged(); } @@ -264,7 +275,7 @@ public void setListData() { overPullHelper.enableOverPullUp(!listAdapter.hasFooter()); overPullHelper.enableOverPullDown(!listAdapter.hasHeader()); } - renderNodeCount = listAdapter.getRenderNodeCount(); + renderNodeCount = currentNodeCount; if (renderNodeCount > 0 && mInitialContentOffset > 0) { scrollToInitContentOffset(); } diff --git a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/hippylist/RecyclerViewEventHelper.java b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/hippylist/RecyclerViewEventHelper.java index fc01c5787a5..a5169be0f36 100644 --- a/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/hippylist/RecyclerViewEventHelper.java +++ b/renderer/native/android/src/main/java/com/tencent/mtt/hippy/views/hippylist/RecyclerViewEventHelper.java @@ -28,6 +28,7 @@ import androidx.recyclerview.widget.HippyStaggeredGridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.Adapter; import androidx.recyclerview.widget.RecyclerView.LayoutManager; import androidx.recyclerview.widget.RecyclerView.OnScrollListener; @@ -56,6 +57,7 @@ public class RecyclerViewEventHelper extends OnScrollListener implements OnLayoutChangeListener, OnAttachStateChangeListener, HippyOverPullListener { + private static final int WATERFALL_SCROLL_RELAYOUT_THRESHOLD = 4; protected final HippyRecyclerView hippyRecyclerView; private boolean scrollBeginDragEventEnable; private boolean scrollEndDragEventEnable; @@ -179,6 +181,21 @@ protected HippyViewEvent getOnScrollDragEndedEvent() { return onScrollDragEndedEvent; } + private void relayoutWaterfallIfNeeded() { + LayoutManager layoutManager = hippyRecyclerView.getLayoutManager(); + if (layoutManager instanceof HippyStaggeredGridLayoutManager) { + int[] firstVisibleItem = null; + firstVisibleItem = ((HippyStaggeredGridLayoutManager) layoutManager).findFirstVisibleItemPositions(firstVisibleItem); + if (firstVisibleItem != null && (firstVisibleItem[0] <= WATERFALL_SCROLL_RELAYOUT_THRESHOLD)) { + Adapter adapter = hippyRecyclerView.getAdapter(); + if (adapter != null) { + adapter.notifyDataSetChanged(); + hippyRecyclerView.dispatchLayout(); + } + } + } + } + @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { int oldState = currentState; @@ -190,6 +207,9 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) { sendDragEndEvent(oldState, currentState); sendFlingEvent(newState); sendFlingEndEvent(oldState, currentState); + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + relayoutWaterfallIfNeeded(); + } } @Override