Skip to content

Commit bd689f4

Browse files
author
alllexey
committed
Fix scroll flickering on update
1 parent fd94157 commit bd689f4

File tree

2 files changed

+33
-14
lines changed

2 files changed

+33
-14
lines changed

app/src/main/java/me/alllexey123/itmowidgets/ui/schedule/DayScheduleAdapter.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import java.time.Duration
1414
import java.time.LocalTime
1515
import java.time.format.DateTimeFormatter
1616

17-
class DayScheduleAdapter(private var daySchedules: List<Schedule>) :
17+
class DayScheduleAdapter(private var schedules: List<Schedule>) :
1818
RecyclerView.Adapter<DayScheduleAdapter.DayViewHolder>() {
1919

2020
private val viewPool = RecyclerView.RecycledViewPool()
@@ -26,7 +26,7 @@ class DayScheduleAdapter(private var daySchedules: List<Schedule>) :
2626
}
2727

2828
override fun onBindViewHolder(holder: DayViewHolder, position: Int) {
29-
val daySchedule = daySchedules[position]
29+
val daySchedule = schedules[position]
3030
holder.dayTitle.text = ScheduleUtils.getRuDayOfWeek(daySchedule.date.dayOfWeek)
3131
val dtf = DateTimeFormatter.ofPattern("dd.MM")
3232
holder.dayDate.text = dtf.format(daySchedule.date)
@@ -48,12 +48,12 @@ class DayScheduleAdapter(private var daySchedules: List<Schedule>) :
4848
}
4949

5050
fun updateData(newDaySchedules: List<Schedule>) {
51-
val oldDaySchedules = this.daySchedules
52-
this.daySchedules = newDaySchedules
51+
val oldDaySchedules = this.schedules
52+
this.schedules = newDaySchedules
5353
if (oldDaySchedules != newDaySchedules)notifyDataSetChanged()
5454
}
5555

56-
override fun getItemCount(): Int = daySchedules.size
56+
override fun getItemCount(): Int = schedules.size
5757

5858
inner class DayViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
5959
val dayTitle: TextView = itemView.findViewById(R.id.dayTitleTextView)

app/src/main/java/me/alllexey123/itmowidgets/ui/schedule/ScheduleActivity.kt

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.alllexey123.itmowidgets.ui.schedule
22

33
import android.os.Bundle
4+
import android.os.Parcelable
45
import android.view.View
56
import android.widget.ProgressBar
67
import android.widget.Toast
@@ -18,6 +19,8 @@ class ScheduleActivity : AppCompatActivity() {
1819
private lateinit var dayScheduleAdapter: DayScheduleAdapter
1920
private lateinit var progressBar: ProgressBar
2021

22+
private val snapHelper = PagerSnapHelper()
23+
2124
private val scheduleViewModel: ScheduleViewModel by viewModels {
2225
val appContainer = (application as ItmoWidgetsApp).appContainer
2326
ScheduleViewModelFactory(appContainer.scheduleRepository)
@@ -43,10 +46,13 @@ class ScheduleActivity : AppCompatActivity() {
4346
dayScheduleAdapter = DayScheduleAdapter(listOf())
4447
outerRecyclerView.adapter = dayScheduleAdapter
4548

46-
val snapHelper = PagerSnapHelper()
4749
snapHelper.attachToRecyclerView(outerRecyclerView)
4850
}
4951

52+
private var isInitialLoad = true
53+
54+
private var layoutManagerState: Parcelable? = null
55+
5056
private fun observeUiState() {
5157
scheduleViewModel.uiState.observe(this) { state ->
5258
when (state) {
@@ -57,22 +63,35 @@ class ScheduleActivity : AppCompatActivity() {
5763

5864
is ScheduleUiState.Success -> {
5965
val scheduleList = state.schedule
60-
dayScheduleAdapter.updateData(scheduleList)
66+
if (scheduleList.isEmpty()) {
67+
outerRecyclerView.visibility = View.GONE
68+
progressBar.visibility = View.GONE
69+
return@observe
70+
}
6171

62-
if (state.isCached) {
63-
progressBar.visibility = View.VISIBLE
72+
val layoutManager = outerRecyclerView.layoutManager as LinearLayoutManager
73+
if (!isInitialLoad) {
74+
layoutManagerState = layoutManager.onSaveInstanceState()
75+
}
6476

65-
// scroll if cached
77+
dayScheduleAdapter.updateData(scheduleList)
78+
79+
if (isInitialLoad) {
6680
val today = LocalDate.now()
6781
val todayIndex = scheduleList.indexOfFirst { it.date == today }
6882
if (todayIndex != -1) {
69-
val layoutManager =
70-
outerRecyclerView.layoutManager as LinearLayoutManager
7183
layoutManager.scrollToPositionWithOffset(todayIndex, 0)
7284
}
73-
} else {
74-
progressBar.visibility = View.GONE
85+
isInitialLoad = false
86+
} else if (layoutManagerState != null) {
87+
layoutManager.onRestoreInstanceState(layoutManagerState)
7588
}
89+
90+
if (scheduleList.isNotEmpty()) {
91+
isInitialLoad = false
92+
}
93+
94+
progressBar.visibility = if (state.isCached) View.VISIBLE else View.GONE
7695
outerRecyclerView.visibility = View.VISIBLE
7796
}
7897

0 commit comments

Comments
 (0)