首页 > 解决方案 > RecyclerView --SelectionTracker 将选择大小限制为 10 个项目

问题描述

我想将我的 RecyclerViewSelectionTracker选择大小限制为 10 个项目(最大)。

SelectionTracker 初始化代码:

val selectionTracker = SelectionTracker.Builder(
                        "my_selection_tracker_id",
                        myRecyclerView,
                        MyItemKeyProvider(),
                        MyItemLookup(myRecyclerView),
                        StorageStrategy.createParcelableStorage(MyItemModel::class.java)
                ).withSelectionPredicate(SelectionPredicates.createSelectAnything())
                .build()

标签: androidandroid-recyclerviewlimitselectionmax-size

解决方案


回答

再次阅读SelectionTracker文档后,我发现了这个:

为了限制可以选择的项目数,
请使用 {@link #canSetStateForKey(Object, boolean)} 和
{@link #canSetStateAtPosition(int, boolean)}。

因此,我从检查项目nextState (selected/deselected) 和selected items sizeoverride canSetStateForKey()的方法中SelectionPredicate
添加if条件。

从有关 canSetStateForKey() 的文档中:

@return 如果 {@code id} 处的项目可以设置为 {@code nextState},则返回 true

将选择大小限制为 10 的条件:

if(nextState && selectionTracker.selection.size() >= 10) {
    return false
} else {
    return true
}


完整的 SelectionTracker 初始化:

val selectionTracker = SelectionTracker.Builder(
                        "my_selection_tracker_id",
                        myRecyclerView,
                        MyItemKeyProvider(),
                        MyItemLookup(myRecyclerView),
                        StorageStrategy.createParcelableStorage(MyItemModel::class.java)
                ).withSelectionPredicate(object : SelectionTracker.SelectionPredicate<AttachmentMediaModel>() {
                    override fun canSelectMultiple(): Boolean {
                        return true
                   }
                   override fun canSetStateForKey(key: AttachmentMediaModel, nextState: Boolean): Boolean {
                       if(nextState && selectionTracker.selection.size() >= 10) { // 10 - max selection size
                           return false // Can't select when 10 items selected
                       }
                       return true // When selection size < 10 - allow selection
                   }
                   override fun canSetStateAtPosition(position: Int, nextState: Boolean): Boolean {
                       return true
                   }
               }).build()

推荐阅读