Android RecyclerView--SelectionTracker将选择大小限制为10项

Android RecyclerView--SelectionTracker将选择大小限制为10项,android,android-recyclerview,limit,selection,max-size,Android,Android Recyclerview,Limit,Selection,Max Size,我想将我的RecyclerViewSelectionTracker选择大小限制为10项(最多) SelectionTracker初始代码: val selectionTracker = SelectionTracker.Builder( "my_selection_tracker_id", myRecyclerView, MyItemKeyProvide

我想将我的RecyclerView
SelectionTracker
选择大小限制为10项(最多)

SelectionTracker初始代码:

val selectionTracker = SelectionTracker.Builder(
                        "my_selection_tracker_id",
                        myRecyclerView,
                        MyItemKeyProvider(),
                        MyItemLookup(myRecyclerView),
                        StorageStrategy.createParcelableStorage(MyItemModel::class.java)
                ).withSelectionPredicate(SelectionPredicates.createSelectAnything())
                .build()
答复 再次阅读
SelectionTracker
文档后,我发现了以下内容:

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

因此,我从
SelectionPredicate

并添加检查项目下一状态(选中/取消选中)和选中项目大小的if条件

来自关于canSetStateForKey()的文档:

@如果{@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()
val selectionTracker=selectionTracker.Builder(
“我的\u选择\u跟踪器\u id”,
MyrView,
MyItemKeyProvider(),
MyItemLookup(myRecyclerView),
createParcelableStorage(MyItemModel::class.java)
).withSelectionPredicate(对象:SelectionTracker.SelectionPredicate(){
override fun canSelectMultiple():布尔值{
返回真值
}
override fun canSetStateForKey(键:AttachmentMediaModel,下一个状态:布尔):布尔{
如果(nextState&&selectionTracker.selection.size()>=10){//10-最大选择大小
return false//选择10项时无法选择
}
返回true//当选择大小小于10时-允许选择
}
override fun canSetStateAtPosition(位置:Int,下一个状态:Boolean):布尔{
返回真值
}
}).build()

我使用了这个选项,但我对它做了一点修改,跟踪器将取消选择最旧的选项,为新的选项“腾出空间”。类似(我的是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;