Browse Source

Android UI - Fix adapter observer lifecycle

Move carousel observer registration to setAdapter() so it is bound to the adapter lifecycle. This prevents repeated observer registration during carousel setup and eliminates duplicate refresh and focus callbacks after changes to the view type.
pull/3216/head
Mike22 1 month ago
parent
commit
e496bdf82d
No known key found for this signature in database GPG Key ID: 1B0AABDFAAABC0EF
  1. 33
      src/android/app/src/main/java/org/yuzu/yuzu_emu/views/CarouselRecyclerView.kt

33
src/android/app/src/main/java/org/yuzu/yuzu_emu/views/CarouselRecyclerView.kt

@ -55,6 +55,16 @@ class CarouselRecyclerView @JvmOverloads constructor(
private val preferences =
PreferenceManager.getDefaultSharedPreferences(YuzuApplication.appContext)
private val carouselAdapterObserver = object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
if (!pendingScrollAfterReload) return
doOnNextLayout {
refreshView()
pendingScrollAfterReload = false
}
}
}
var flingMultiplier: Float = 1f
var pendingScrollAfterReload: Boolean = false
@ -70,6 +80,18 @@ class CarouselRecyclerView @JvmOverloads constructor(
setChildrenDrawingOrderEnabled(true)
}
override fun setAdapter(adapter: Adapter<*>?) {
val oldAdapter = this.adapter as? GameAdapter
if (oldAdapter !== adapter) {
oldAdapter?.unregisterAdapterDataObserver(carouselAdapterObserver)
}
super.setAdapter(adapter)
(adapter as? GameAdapter)?.registerAdapterDataObserver(carouselAdapterObserver)
}
private fun calculateCenter(width: Int, paddingStart: Int, paddingEnd: Int): Int {
return paddingStart + (width - paddingStart - paddingEnd) / 2
}
@ -252,17 +274,6 @@ class CarouselRecyclerView @JvmOverloads constructor(
internalFlingMultiplier
).coerceIn(1f, 5f)
gameAdapter .registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
if (pendingScrollAfterReload) {
doOnNextLayout {
refreshView()
pendingScrollAfterReload = false
}
}
}
})
// Detach SnapHelper during setup
pagerSnapHelper?.attachToRecyclerView(null)

Loading…
Cancel
Save