fix a glitch at event list view jumping at top refreshing

This commit is contained in:
tibbi 2019-12-02 22:29:53 +01:00
parent c58f1fbbb8
commit 916f93ec7b

View File

@ -17,15 +17,21 @@ import com.simplemobiletools.calendar.pro.helpers.EVENT_OCCURRENCE_TS
import com.simplemobiletools.calendar.pro.helpers.Formatter import com.simplemobiletools.calendar.pro.helpers.Formatter
import com.simplemobiletools.calendar.pro.models.Event import com.simplemobiletools.calendar.pro.models.Event
import com.simplemobiletools.calendar.pro.models.ListEvent import com.simplemobiletools.calendar.pro.models.ListEvent
import com.simplemobiletools.calendar.pro.models.ListItem
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.MONTH_SECONDS import com.simplemobiletools.commons.helpers.MONTH_SECONDS
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.commons.views.MyLinearLayoutManager
import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.commons.views.MyRecyclerView
import kotlinx.android.synthetic.main.fragment_event_list.view.* import kotlinx.android.synthetic.main.fragment_event_list.view.*
import org.joda.time.DateTime import org.joda.time.DateTime
import java.util.* import java.util.*
class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener { class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
private val NOT_UPDATING = 0
private val UPDATE_TOP = 1
private val UPDATE_BOTTOM = 2
private var FETCH_INTERVAL = 3 * MONTH_SECONDS private var FETCH_INTERVAL = 3 * MONTH_SECONDS
private var MIN_EVENTS_TRESHOLD = 30 private var MIN_EVENTS_TRESHOLD = 30
@ -33,6 +39,7 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
private var minFetchedTS = 0L private var minFetchedTS = 0L
private var maxFetchedTS = 0L private var maxFetchedTS = 0L
private var wereInitialEventsAdded = false private var wereInitialEventsAdded = false
private var bottomItemAtRefresh: ListItem? = null
private var use24HourFormat = false private var use24HourFormat = false
@ -78,21 +85,21 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
context!!.eventsHelper.getEvents(minFetchedTS, maxFetchedTS) { context!!.eventsHelper.getEvents(minFetchedTS, maxFetchedTS) {
if (it.size >= MIN_EVENTS_TRESHOLD) { if (it.size >= MIN_EVENTS_TRESHOLD) {
receivedEvents(it, false) receivedEvents(it, NOT_UPDATING)
} else { } else {
if (!wereInitialEventsAdded) { if (!wereInitialEventsAdded) {
maxFetchedTS += FETCH_INTERVAL maxFetchedTS += FETCH_INTERVAL
} }
context!!.eventsHelper.getEvents(minFetchedTS, maxFetchedTS) { context!!.eventsHelper.getEvents(minFetchedTS, maxFetchedTS) {
mEvents = it mEvents = it
receivedEvents(mEvents, false, !wereInitialEventsAdded) receivedEvents(mEvents, NOT_UPDATING, !wereInitialEventsAdded)
} }
} }
wereInitialEventsAdded = true wereInitialEventsAdded = true
} }
} }
private fun receivedEvents(events: ArrayList<Event>, scrollAfterUpdating: Boolean, forceRecreation: Boolean = false) { private fun receivedEvents(events: ArrayList<Event>, updateStatus: Int, forceRecreation: Boolean = false) {
if (context == null || activity == null) { if (context == null || activity == null) {
return return
} }
@ -121,12 +128,17 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
} }
override fun updateBottom() { override fun updateBottom() {
fetchNextPeriod(true) fetchNextPeriod()
} }
} }
} else { } else {
(currAdapter as EventListAdapter).updateListItems(listItems) (currAdapter as EventListAdapter).updateListItems(listItems)
if (scrollAfterUpdating) { if (updateStatus == UPDATE_TOP) {
val item = listItems.indexOfFirst { it == bottomItemAtRefresh }
if (item != -1) {
mView.calendar_events_list.scrollToPosition(item)
}
} else if (updateStatus == UPDATE_BOTTOM) {
mView.calendar_events_list.smoothScrollBy(0, context!!.resources.getDimension(R.dimen.endless_scroll_move_height).toInt()) mView.calendar_events_list.smoothScrollBy(0, context!!.resources.getDimension(R.dimen.endless_scroll_move_height).toInt())
} }
} }
@ -151,20 +163,23 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
} }
private fun fetchPreviousPeriod() { private fun fetchPreviousPeriod() {
val lastPosition = (mView.calendar_events_list.layoutManager as MyLinearLayoutManager).findLastVisibleItemPosition()
bottomItemAtRefresh = (mView.calendar_events_list.adapter as EventListAdapter).listItems[lastPosition]
val oldMinFetchedTS = minFetchedTS - 1 val oldMinFetchedTS = minFetchedTS - 1
minFetchedTS -= FETCH_INTERVAL minFetchedTS -= FETCH_INTERVAL
context!!.eventsHelper.getEvents(minFetchedTS, oldMinFetchedTS) { context!!.eventsHelper.getEvents(minFetchedTS, oldMinFetchedTS) {
mEvents.addAll(0, it) mEvents.addAll(0, it)
receivedEvents(mEvents, false) receivedEvents(mEvents, UPDATE_TOP)
} }
} }
private fun fetchNextPeriod(scrollAfterUpdating: Boolean) { private fun fetchNextPeriod() {
val oldMaxFetchedTS = maxFetchedTS + 1 val oldMaxFetchedTS = maxFetchedTS + 1
maxFetchedTS += FETCH_INTERVAL maxFetchedTS += FETCH_INTERVAL
context!!.eventsHelper.getEvents(oldMaxFetchedTS, maxFetchedTS) { context!!.eventsHelper.getEvents(oldMaxFetchedTS, maxFetchedTS) {
mEvents.addAll(it) mEvents.addAll(it)
receivedEvents(mEvents, scrollAfterUpdating) receivedEvents(mEvents, UPDATE_BOTTOM)
} }
} }