根据docs,StorageStrategy用于存储keys的保存状态,
/* for Long keys */ StorageStrategy.createLongStorage()
/* for String keys */ StorageStrategy.createStringStorage()
/* for Parcelable keys */ StorageStrategy.createParcelableStorage(Class)
另外,根据docs,StableIdKeyProvider 提供Long 类型的键。这就是为什么您的 StorageStrategy 显示错误,因为它需要 Long 键。
要提供String 密钥,您必须创建自己的ItemKeyProvider 类。有关ItemKeyProvider的更多详细信息,您可以在此处参考docs。
这是您可以为String 键实现ItemKeyProvider 类的方法:
class MyItemKeyProvider(private val rvAdapter: MyAdapter): ItemKeyProvider<String>(SCOPE_CACHED) {
override fun getKey(position: Int): String = rvAdapter.getItem(position).myKey
override fun getPosition(key: String): Int = rvAdapter.getPosition(key)
}
在MyAdapter:
class MyAdapter(private val myList: ArrayList<MyModel>): RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
// functions used in MyItemKeyProvider
fun getItem(position: Int) = myList[position]
fun getPosition(key: String) = myList.indexOfFirst { it.myKey == key }
// other functions
}
MyModel 是这样的:
data class MyModel (
val myKey: String,
// other data
)
现在,您可以像这样简单地构建您的SelectionTracker:
myTracker = SelectionTracker.Builder(
"my_selection_id",
recyclerView,
MyItemKeyProvider(rvAdapter),
MyItemDetailsLookup(recyclerView),
StorageStrategy.createStringStorage()
).withSelectionPredicate(
SelectionPredicates.createSelectAnything()
).build()
请注意,如果您不使用StableIdKeyProvider,则不应在Adapter 中编写以下代码:
init { setHasStableIds(true) }
否则会显示这个错误:
Attempt to invoke virtual method 'boolean androidx.recyclerview.widget.RecyclerView$ViewHolder.shouldIgnore()' on a null object reference
这个tutorial 展示了如何使用Long 键实现recyclerview-selection,还展示了如何为Long 键实现您自己的ItemKeyProvider 类。
要使用Parcelable 键实现recyclerview-selection,我找到了示例代码here。