реселлер-просмотр-выбор: остановите автоотключение элемента при касании пустого пространства внутри рециркулятора - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь использовать библиотеку recyclerview-selection в моем проекте. Я следовал этому уроку:

https://proandroiddev.com/a-guide-to-recyclerview-selection-3ed9f2381504

Все работает отлично. Но у меня есть проблема. Если я коснусь / коснусь любого пустого пространства внутри RecyclerView, все выбранные элементы будут отменены! Я не нахожу какой-либо метод или решение, чтобы отключить это. Что мне делать?

Я использую implementation 'androidx.recyclerview:recyclerview-selection:1.1.0-rc01' в своем проекте.

Редактировать 1:

example image

Я установил фон RecyclerView красным, чтобы описать мою проблему. Здесь синие предметы - это выделенные предметы. Если я щелкну любую красную область, то все выбранные элементы будут отменены! Выбор и отмена выбора должны быть сделаны только путем нажатия на элементы. Итак, мне нужно отключить эту функцию (или ошибку!), Которая отменяет выбор всех элементов!

Пример проекта: https://github.com/ImaginativeShohag/multiselection

1 Ответ

0 голосов
/ 30 марта 2020

Вы создаете свой собственный SelectionTracker.SelectionPredicate<Long>.

Переопределите метод canSetStateForKey(key: Long, nextState: Boolean)

следующим образом:

override fun canSetStateForKey(@NonNull key: Long, nextState: Boolean): Boolean {
    rv.findViewHolderForItemId(key)?.let { holder -> adapter.canSetStateForItem(holder as YourItemHolder<YourItem>, nextState)}
    return true
}

и в вашем ViewHolder проверьте, если элемент уже выбран, если так return false или наоборот наоборот.

Редактировать:

Вы также можете определить «Точку выбора» с помощью inSelectionHotspot(e: MotionEvent) в вашем ItemDetailsLookup.ItemDetails.

В вашем ViewHolder, то вы можете проверить, находится ли TouchEvent в области, которая требует выбора или отмены выбора.

, например:

override fun inSelectionHotspot(e: MotionEvent): Boolean {
    val rect = Rect()
    itemView.getGlobalVisibleRect(rect)
    if (rect.contains(e.rawX.toInt(), e.rawY.toInt())) { 
        //  in select region
    } else { 
        // not in select region 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...