From 6bba64384fe1da6d4c7e5ebe915913659127db29 Mon Sep 17 00:00:00 2001 From: 3440395 <1152433972@qq.com> Date: Thu, 9 Feb 2017 23:17:10 +0800 Subject: [PATCH] Update FlowLayoutManager.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复当item不足一页时,上滑,item乱跳的bug --- .../layoutmanager/flow/FlowLayoutManager.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/layoutmanager/src/main/java/com/mcxtzhang/layoutmanager/flow/FlowLayoutManager.java b/layoutmanager/src/main/java/com/mcxtzhang/layoutmanager/flow/FlowLayoutManager.java index fbcaa29..6ab66c4 100644 --- a/layoutmanager/src/main/java/com/mcxtzhang/layoutmanager/flow/FlowLayoutManager.java +++ b/layoutmanager/src/main/java/com/mcxtzhang/layoutmanager/flow/FlowLayoutManager.java @@ -165,7 +165,10 @@ private int fill(RecyclerView.Recycler recycler, RecyclerView.State state, int d } //添加完后,判断是否已经没有更多的ItemView,并且此时屏幕仍有空白,则需要修正dy View lastChild = getChildAt(getChildCount() - 1); - if (getPosition(lastChild) == getItemCount() - 1) { + + View firstVisibleChild = getChildAt(0); + //要做底部修复,还要满足下面第一个条件:第一个显示的View的top在屏幕之外 + if (firstVisibleChild.getTop() < 0 && getPosition(lastChild) == getItemCount() - 1) { int gap = getHeight() - getPaddingBottom() - getDecoratedBottom(lastChild); if (gap > 0) { dy -= gap; @@ -227,9 +230,13 @@ public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerVi View lastChild = getChildAt(getChildCount() - 1); if (getPosition(lastChild) == getItemCount() - 1) { int gap = getHeight() - getPaddingBottom() - getDecoratedBottom(lastChild); - if (gap > 0) { + + + View firstVisibleChild = getChildAt(0); + //当前显示的第一个View的top小于零,说明该recyclerview发生了滚动,可以做底部修复 + if (gap > 0 && firstVisibleChild.getTop() < 0) { realOffset = -gap; - } else if (gap == 0) { + } else if (gap == 0 || firstVisibleChild.getTop() >= 0) {//当前第一个显示的top大于等于0,并且最后一个显示的就是最后一个,那一定不需要滚动了,即使gap!=0,也不需要修复 realOffset = 0; } else { realOffset = Math.min(realOffset, -gap);