From 30cb7c128e1bf7494960e49493282790fb8d413d Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Sun, 25 Mar 2018 18:31:33 +0200 Subject: [PATCH] Finally reliably fix the scroll issue --- .../ui/chat/messages/MessageListFragment.kt | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt index de44cff2b..bf0625c4b 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt @@ -83,6 +83,7 @@ class MessageListFragment : ServiceBoundFragment() { messageList.itemAnimator = null messageList.setItemViewCacheSize(20) + var isScrolling = false messageList.addOnScrollListener( object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { @@ -93,7 +94,13 @@ class MessageListFragment : ServiceBoundFragment() { scrollDown.toggle(canScrollDown && isScrollingDown) } - override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) = Unit + override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) { + isScrolling = when (newState) { + RecyclerView.SCROLL_STATE_SETTLING, RecyclerView.SCROLL_STATE_IDLE -> false + RecyclerView.SCROLL_STATE_DRAGGING -> true + else -> isScrolling + } + } }) val data = viewModel.buffer_liveData.switchMapNotNull { buffer -> @@ -124,15 +131,6 @@ class MessageListFragment : ServiceBoundFragment() { if (message != null && bufferSyncer != null && previousMessageId != message.messageId) { markAsRead(bufferSyncer, message.bufferId, message.messageId) previousMessageId = message.messageId - - if (firstVisibleItemPosition < 2) { - activity?.runOnUiThread { messageList.scrollToPosition(0) } - runInBackgroundDelayed(16) { - activity?.runOnUiThread { - messageList.scrollToPosition(0) - } - } - } } } }) @@ -144,6 +142,17 @@ class MessageListFragment : ServiceBoundFragment() { } }) + fun checkScroll() { + if (linearLayoutManager.findFirstVisibleItemPosition() < 2 && !isScrolling) { + messageList.scrollToPosition(0) + } + } + + adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onChanged() = checkScroll() + override fun onItemRangeInserted(positionStart: Int, itemCount: Int) = checkScroll() + }) + var lastBuffer = -1 data.observe(this, Observer { list -> val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition() -- GitLab