diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesScene.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesScene.kt index 001566c41..7bd8ddca4 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesScene.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/FavoritesScene.kt @@ -360,7 +360,7 @@ class FavoritesScene : SearchBarScene() { "favorite-selection", this, { adapter.snapshot().items }, - { (this as GalleryHolder).galleryId }, + { (this as? GalleryHolder)?.galleryId }, ).apply { addCustomChoiceListener({ showSelectionFab() diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GallerySelectionTracker.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GallerySelectionTracker.kt index 8cc90e67c..78a0b7bf8 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GallerySelectionTracker.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/scene/GallerySelectionTracker.kt @@ -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( selectionId: String, recyclerView: RecyclerView, private val getItems: () -> List, - getItemKey: RecyclerView.ViewHolder.() -> Long, + getItemKey: RecyclerView.ViewHolder.() -> Long?, builder: SelectionTracker.Builder.() -> Unit = {}, ) { - private val tracker: SelectionTracker + private val adapter = recyclerView.adapter as? ConcatAdapter + private val tracker = SelectionTracker.Builder( + selectionId, + recyclerView, + object : ItemKeyProvider(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() { + override fun getItemDetails(e: MotionEvent) = + recyclerView.findChildViewUnder(e.x, e.y)?.let { + recyclerView.getChildViewHolder(it).run { + object : ItemDetails() { + 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(SCOPE_MAPPED) { - override fun getKey(position: Int) = getItems()[position].gid - override fun getPosition(key: Long) = getItems().indexOfFirst { it.gid == key } - }, - object : ItemDetailsLookup() { - override fun getItemDetails(e: MotionEvent) = - recyclerView.findChildViewUnder(e.x, e.y)?.let { - recyclerView.getChildViewHolder(it).run { - object : ItemDetails() { - override fun getPosition() = bindingAdapterPosition - override fun getSelectionKey() = getItemKey() - } - } - } - }, - StorageStrategy.createLongStorage(), - ).apply(builder).build() - } - fun addCustomChoiceListener(onIntoCustomChoiceListener: () -> Unit, onOutOfCustomChoiceListener: () -> Unit) { tracker.addObserver(object : SelectionTracker.SelectionObserver() { override fun onSelectionChanged() {