【问题标题】:RecyclerView --SelectionTracker limit selection size to 10 itemsRecyclerView --SelectionTracker 将选择大小限制为 10 个项目
【发布时间】:2020-09-06 16:24:12
【问题描述】:

我想将我的 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()

【问题讨论】:

    标签: android android-recyclerview limit selection max-size


    【解决方案1】:

    回答

    再次阅读SelectionTracker文档后,我找到了这个:

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

    所以,我 override canSetStateForKey() 方法来自 SelectionPredicate
    并添加 if 条件来检查项目 nextState(选中/取消选中)和 选中项目大小

    来自有关 canSetStateForKey() 的文档:

    如果{@code id} 处的项目可以设置为{@code nextState},则@return 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()
    

    【讨论】:

      【解决方案2】:

      我使用了这个,但我对其进行了一些更改,跟踪器将取消选择最旧的选择,以便为新选择“腾出空间”。类似(我的是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;
      

      }

      【讨论】:

        猜你喜欢
        • 2019-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-28
        • 1970-01-01
        • 2015-07-21
        相关资源
        最近更新 更多