Fix crash when clicking retry button in favorites

This commit is contained in:
FooIbar committed 2023-11-04 23:59:40 +08:00
1 parent e0cad8600c
commit 022f7a3ef1
2 files changed
+40 -26

No files matched your search

@@ -360,7 +360,7 @@ class FavoritesScene : SearchBarScene() {
"favorite-selection",
this,
{ adapter.snapshot().items },
{ (this as GalleryHolder).galleryId },
{ (this as? GalleryHolder)?.galleryId },
).apply {
addCustomChoiceListener({
showSelectionFab()
@@ -2,10 +2,13 @@ package com.hippo.ehviewer.ui.scene
import android.os.Bundle
import android.view.MotionEvent
import androidx.core.util.component1
import androidx.core.util.component2
import androidx.recyclerview.selection.ItemDetailsLookup
import androidx.recyclerview.selection.ItemKeyProvider
import androidx.recyclerview.selection.SelectionTracker
import androidx.recyclerview.selection.StorageStrategy
import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.RecyclerView
import com.hippo.ehviewer.client.data.GalleryInfo
@@ -13,37 +16,48 @@ class GallerySelectionTracker<T : GalleryInfo>(
selectionId: String,
recyclerView: RecyclerView,
private val getItems: () -> List<T>,
getItemKey: RecyclerView.ViewHolder.() -> Long,
getItemKey: RecyclerView.ViewHolder.() -> Long?,
builder: SelectionTracker.Builder<Long>.() -> Unit = {},
) {
private val tracker: SelectionTracker<Long>
private val adapter = recyclerView.adapter as? ConcatAdapter
private val tracker = SelectionTracker.Builder(
selectionId,
recyclerView,
object : ItemKeyProvider<Long>(SCOPE_MAPPED) {
override fun getKey(position: Int) =
if (adapter != null) {
val (wrappedAdapter, localPosition) = adapter.getWrappedAdapterAndPosition(position)
(wrappedAdapter as? GalleryAdapter)?.let {
getItems()[localPosition].gid
}
} else {
getItems()[position].gid
}
override fun getPosition(key: Long) =
if (adapter != null) {
adapter.adapters[0].itemCount
} else {
0
} + getItems().indexOfFirst { it.gid == key }
},
object : ItemDetailsLookup<Long>() {
override fun getItemDetails(e: MotionEvent) =
recyclerView.findChildViewUnder(e.x, e.y)?.let {
recyclerView.getChildViewHolder(it).run {
object : ItemDetails<Long>() {
override fun getPosition() = absoluteAdapterPosition
override fun getSelectionKey() = getItemKey()
}
}
}
},
StorageStrategy.createLongStorage(),
).apply(builder).build()
val selectionSize get() = tracker.selection.size()
var isInCustomChoice = false
private set
init {
tracker = SelectionTracker.Builder(
selectionId,
recyclerView,
object : ItemKeyProvider<Long>(SCOPE_MAPPED) {
override fun getKey(position: Int) = getItems()[position].gid
override fun getPosition(key: Long) = getItems().indexOfFirst { it.gid == key }
},
object : ItemDetailsLookup<Long>() {
override fun getItemDetails(e: MotionEvent) =
recyclerView.findChildViewUnder(e.x, e.y)?.let {
recyclerView.getChildViewHolder(it).run {
object : ItemDetails<Long>() {
override fun getPosition() = bindingAdapterPosition
override fun getSelectionKey() = getItemKey()
}
}
}
},
StorageStrategy.createLongStorage(),
).apply(builder).build()
}
fun addCustomChoiceListener(onIntoCustomChoiceListener: () -> Unit, onOutOfCustomChoiceListener: () -> Unit) {
tracker.addObserver(object : SelectionTracker.SelectionObserver<Long>() {
override fun onSelectionChanged() {