Fix crash when clicking retry button in favorites
This commit is contained in:
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() {
|
||||
|
||||
Reference in new issue
Block a user