From 77440f718150db4362a0808e79a4969aab69f79e Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 20 Aug 2019 19:33:43 +0200 Subject: [PATCH] Fixed/improved scroll to top/bottom of expanded message --- .../eu/faircode/email/FragmentMessages.java | 35 +++++++++++-------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index af2badbfc8..4664479235 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -1028,32 +1028,37 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. } private void scrollToVisibleItem(LinearLayoutManager llm, boolean bottom) { - int pos = llm.findLastVisibleItemPosition(); - if (pos == RecyclerView.NO_POSITION) + int first = llm.findFirstVisibleItemPosition(); + int last = llm.findLastVisibleItemPosition(); + if (first == RecyclerView.NO_POSITION || last == RecyclerView.NO_POSITION) return; + int pos = (bottom ? last : first); do { Long key = adapter.getKeyAtPosition(pos); if (key != null && iProperties.getValue("expanded", key)) { - int first = llm.findFirstVisibleItemPosition(); - View child = rvMessage.getChildAt(pos - (first < 0 ? 0 : first)); - + View child = llm.findViewByPosition(pos); if (child != null) { TranslateAnimation bounce = new TranslateAnimation( - 0, 0, Helper.dp2pixels(getContext(), bottom ? -12 : 12), 0); + 0, 0, Helper.dp2pixels(getContext(), bottom ? -6 : 6), 0); bounce.setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime)); child.startAnimation(bounce); + + if (bottom) + llm.scrollToPositionWithOffset(pos, + rvMessage.getHeight() - llm.getDecoratedMeasuredHeight(child) + child.getPaddingBottom()); + else + llm.scrollToPositionWithOffset(pos, -child.getPaddingTop()); + + break; } - - if (bottom && child != null) - llm.scrollToPositionWithOffset(pos, rvMessage.getHeight() - llm.getDecoratedMeasuredHeight(child)); - else - rvMessage.scrollToPosition(pos); - - break; } - pos--; - } while (pos >= 0); + + if (bottom) + pos--; + else + pos++; + } while (pos >= first && pos <= last); } private void onSwipeRefresh() {