fetch new items at EventList when scrolled to the bottom

This commit is contained in:
tibbi 2018-05-07 10:48:45 +02:00
parent aeceab60dd
commit d6070249ab
6 changed files with 62 additions and 19 deletions

View File

@ -46,7 +46,7 @@ ext {
}
dependencies {
implementation 'com.simplemobiletools:commons:3.21.6'
implementation 'com.simplemobiletools:commons:3.21.10'
implementation 'joda-time:joda-time:2.9.9'
implementation 'com.facebook.stetho:stetho:1.5.0'
implementation 'com.android.support:multidex:1.0.3'

View File

@ -25,7 +25,7 @@ import com.simplemobiletools.commons.views.MyRecyclerView
import kotlinx.android.synthetic.main.event_list_item.view.*
import java.util.*
class EventListAdapter(activity: SimpleActivity, val listItems: ArrayList<ListItem>, val allowLongClick: Boolean, val listener: RefreshRecyclerViewListener?,
class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListItem>, val allowLongClick: Boolean, val listener: RefreshRecyclerViewListener?,
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
private val ITEM_EVENT = 0
@ -37,6 +37,7 @@ class EventListAdapter(activity: SimpleActivity, val listItems: ArrayList<ListIt
private val dimPastEvents = activity.config.dimPastEvents
private val now = getNowSeconds()
private var use24HourFormat = activity.config.use24HourFormat
private var currentItemsHash = listItems.hashCode()
init {
var firstNonPastSectionIndex = -1
@ -100,6 +101,16 @@ class EventListAdapter(activity: SimpleActivity, val listItems: ArrayList<ListIt
notifyDataSetChanged()
}
fun updateListItems(newListItems: ArrayList<ListItem>) {
if (newListItems.hashCode() != currentItemsHash) {
currentItemsHash = newListItems.hashCode()
listItems = newListItems.clone() as ArrayList<ListItem>
recyclerView.resetItemCount()
notifyDataSetChanged()
finishActMode()
}
}
private fun setupListEvent(view: View, listEvent: ListEvent) {
view.apply {
event_section_title.text = listEvent.title

View File

@ -137,9 +137,9 @@ fun Context.getRepetitionText(seconds: Int) = when (seconds) {
}
}
fun Context.getFilteredEvents(events: List<Event>): List<Event> {
fun Context.getFilteredEvents(events: List<Event>): ArrayList<Event> {
val displayEventTypes = config.displayEventTypes
return events.filter { displayEventTypes.contains(it.eventType.toString()) }
return events.filter { displayEventTypes.contains(it.eventType.toString()) } as ArrayList<Event>
}
fun Context.notifyRunningEvents() {

View File

@ -19,15 +19,23 @@ import com.simplemobiletools.calendar.models.Event
import com.simplemobiletools.calendar.models.ListEvent
import com.simplemobiletools.commons.extensions.beGoneIf
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.helpers.MONTH_SECONDS
import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
import com.simplemobiletools.commons.views.MyRecyclerView
import kotlinx.android.synthetic.main.fragment_event_list.view.*
import org.joda.time.DateTime
import java.util.*
class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
private var mEvents: List<Event> = ArrayList()
private var FETCH_INTERVAL = 6 * MONTH_SECONDS
private var mEvents = ArrayList<Event>()
private var prevEventsHash = 0
private var minFetchedTS = 0
private var maxFetchedTS = 0
private var use24HourFormat = false
lateinit var mView: View
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@ -57,14 +65,17 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
}
private fun checkEvents() {
val fromTS = DateTime().seconds() - context!!.config.displayPastEvents * 60
val toTS = DateTime().plusYears(1).seconds()
context!!.dbHelper.getEvents(fromTS, toTS) {
minFetchedTS = DateTime().minusMonths(3).seconds()
maxFetchedTS = DateTime().plusMonths(6).seconds()
context!!.dbHelper.getEvents(minFetchedTS, maxFetchedTS) {
receivedEvents(it)
if (it.size < 20) {
fetchNextPeriod()
}
}
}
private fun receivedEvents(events: MutableList<Event>) {
private fun receivedEvents(events: ArrayList<Event>) {
if (context == null || activity == null) {
return
}
@ -79,14 +90,25 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
mEvents = filtered
val listItems = context!!.getEventListItems(mEvents)
val eventsAdapter = EventListAdapter(activity as SimpleActivity, listItems, true, this, mView.calendar_events_list) {
if (it is ListEvent) {
editEvent(it)
}
}
activity?.runOnUiThread {
mView.calendar_events_list.adapter = eventsAdapter
val currAdapter = mView.calendar_events_list.adapter
if (currAdapter == null) {
EventListAdapter(activity as SimpleActivity, listItems, true, this, mView.calendar_events_list) {
if (it is ListEvent) {
editEvent(it)
}
}.apply {
mView.calendar_events_list.adapter = this
}
mView.calendar_events_list.endlessScrollListener = object : MyRecyclerView.EndlessScrollListener {
override fun updateBottom() {
fetchNextPeriod()
}
}
} else {
(currAdapter as EventListAdapter).updateListItems(listItems)
}
checkPlaceholderVisibility()
}
}
@ -106,6 +128,15 @@ class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
}
}
private fun fetchNextPeriod() {
val oldMaxFetchedTS = maxFetchedTS + 1
maxFetchedTS += FETCH_INTERVAL
context!!.dbHelper.getEvents(oldMaxFetchedTS, maxFetchedTS) {
mEvents.addAll(it)
receivedEvents(mEvents)
}
}
override fun refreshItems() {
checkEvents()
}

View File

@ -660,13 +660,13 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
}.start()
}
fun getEvents(fromTS: Int, toTS: Int, eventId: Int = -1, callback: (events: MutableList<Event>) -> Unit) {
fun getEvents(fromTS: Int, toTS: Int, eventId: Int = -1, callback: (events: ArrayList<Event>) -> Unit) {
Thread {
getEventsInBackground(fromTS, toTS, eventId, callback)
}.start()
}
fun getEventsInBackground(fromTS: Int, toTS: Int, eventId: Int = -1, callback: (events: MutableList<Event>) -> Unit) {
fun getEventsInBackground(fromTS: Int, toTS: Int, eventId: Int = -1, callback: (events: ArrayList<Event>) -> Unit) {
val events = ArrayList<Event>()
var selection = "$COL_START_TS <= ? AND $COL_END_TS >= ? AND $COL_REPEAT_INTERVAL IS NULL AND $COL_START_TS != 0"
@ -680,7 +680,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
events.addAll(getAllDayEvents(fromTS, eventId))
val filtered = events.distinct().filterNot { it.ignoreEventOccurrences.contains(Formatter.getDayCodeFromTS(it.startTS).toInt()) } as MutableList<Event>
val filtered = events.distinct().filterNot { it.ignoreEventOccurrences.contains(Formatter.getDayCodeFromTS(it.startTS).toInt()) } as ArrayList<Event>
callback(filtered)
}

View File

@ -11,6 +11,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:overScrollMode="never"
android:paddingTop="@dimen/medium_margin"
android:scrollbars="vertical"
android:visibility="gone"