1

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

SelectionTracker 初始化代码:

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

2 回答 2

2

回答

再次阅读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()
于 2020-05-20T10:28:39.773 回答
1

我使用了它,但我对其进行了一些更改,跟踪器将取消选择最旧的选择,以便为新选择“腾出空间”。类似(我的是java,我只使用一个long键)

@Override
public boolean canSetStateForKey(@NonNull Long key, boolean nextState) {
    if (nextState && tracker.getSelection().size() >= MAX_SELECTIONS) {
        // Deselect the first selection and return true to allow the new item to be selected
        tracker.deselect(tracker.getSelection().iterator().next());
    }
    return true;

}

于 2021-03-12T18:56:25.590 回答