diff --git a/base-filters/README.md b/base-filters/README.md index bd35f8f..99de784 100644 --- a/base-filters/README.md +++ b/base-filters/README.md @@ -12,16 +12,18 @@ ### Как использовать ``` kotlin val selectorView = ListSelectionView>(context) - .setItems(navArgs.items) - .addItemDecoration((TopDividerItemDecoration( - context = requireContext(), - drawableId = R.drawable.list_divider_1dp, - startMargin = START_MARGIN_DIVIDER_DP.px - ))) - .withSelectionType(ListSelectionView.SelectionType.SINGLE_SELECT) - .onResultListener { items -> - viewModel.dispatchAction(SelectItemAction.SelectItem(items)) } - .build() + .Builder() + .setItems(navArgs.items) + .addItemDecoration((TopDividerItemDecoration( + context = requireContext(), + drawableId = R.drawable.list_divider_1dp, + startMargin = START_MARGIN_DIVIDER_DP.px + ))) + .withSelectionType(ListSelectionView.SelectionType.SINGLE_SELECT) + .onResultListener { items -> + viewModel.dispatchAction(SelectItemAction.SelectItem(items)) + } + .build() ``` ### Конфигурации * при создании `ListSelectionView` необходимо передлать `ItemType` - класс модели данных в списке, `HolderType` - класс viewHolder-а в recyclerView. @@ -34,15 +36,16 @@ val selectorView = ListSelectionView)` используется для определения кастомного viewHolder для списка с недефолтной разметкой. ``` kotlin val selectorView = ListSelectionView(context) - .showInHolder { parent, clickListener, selectionType -> - TestItemViewHolder( - binding = TestSelectionItemBinding.inflate(LayoutInflater.from(parent.context), parent, false), - onItemSelectAction = clickListener, - selectionType = selectionType - ) - } - ... - .build() + .Builder() + .showInHolder { parent, clickListener, selectionType -> + TestItemViewHolder( + binding = TestSelectionItemBinding.inflate(LayoutInflater.from(parent.context), parent, false), + onItemSelectAction = clickListener, + selectionType = selectionType + ) + } + ... + .build() ``` * колбэк `onSelectedItemsListener(listener: OnSelectedItemsListener)` можно использовать для получения списка всех элементов `ItemType` после каждого выбора * колбэк `onSelectedItemListener(listener: OnSelectedItemListener)` можно использовать для получения элемента списка `ItemType`, по которому произошел клик @@ -79,8 +82,9 @@ val selectorView = ListSelectionView(cont ``` kotlin val newContext = ContextThemeWrapper(requireContext(), R.style.Theme_Custom_FilterSelection) val selectorView = ListSelectionView(newContext) - ... - .build() + .Builder() + ... + .build() ``` ## 2. Выбор одного/нескольких значений из перечня тегов diff --git a/base-filters/build.gradle b/base-filters/build.gradle index a8904a1..6c57558 100644 --- a/base-filters/build.gradle +++ b/base-filters/build.gradle @@ -19,7 +19,11 @@ dependencies { implementation("androidx.appcompat:appcompat") implementation("com.google.android.material:material") - implementation("androidx.constraintlayout:constraintlayout:2.2.0-alpha03") + implementation("androidx.constraintlayout:constraintlayout") { + version { + require '2.0.0' + } + } constraints { implementation("androidx.appcompat:appcompat") { diff --git a/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/ListSelectionView.kt b/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/ListSelectionView.kt index 03c1413..bdd5646 100644 --- a/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/ListSelectionView.kt +++ b/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/ListSelectionView.kt @@ -14,8 +14,8 @@ import ru.touchin.roboswag.base_filters.select_list_item.adapter.SheetSelectionA import ru.touchin.roboswag.base_filters.select_list_item.model.BaseSelectionItem import ru.touchin.roboswag.base_filters.SelectionType -typealias OnSelectedItemListener = (item: ItemType) -> Unit -typealias OnSelectedItemsListener = (items: List) -> Unit +private typealias OnSelectedItemListener = (item: ItemType) -> Unit +private typealias OnSelectedItemsListener = (items: List) -> Unit /** * Base [ListSelectionView] to use in filters screen for choosing single or multi items in list. @@ -26,7 +26,7 @@ typealias OnSelectedItemsListener = (items: List) -> Unit * @param HolderType Type of viewHolder in recyclerView. * It must implement [BaseSelectionViewHolder] abstract class. * -**/ + **/ class ListSelectionView @JvmOverloads constructor( context: Context, @@ -34,8 +34,8 @@ class ListSelectionView @JvmOverloads constructor( defStyleAttr: Int = 0, defStyleRes: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr, defStyleRes) - where ItemType: BaseSelectionItem, - HolderType: BaseSelectionViewHolder{ + where ItemType : BaseSelectionItem, + HolderType : BaseSelectionViewHolder { private var mutableItems: List = emptyList() private var selectionType = SelectionType.SINGLE_SELECT @@ -83,37 +83,40 @@ class ListSelectionView @JvmOverloads constructor( updateList() } - fun setItems(items: List) = apply { - mutableItems = items - } + inner class Builder { - fun setItems( - source: List, - mapper: (T) -> ItemType - ) = setItems(source.map { item -> mapper.invoke(item) }) + fun setItems(items: List) = apply { + mutableItems = items + } - fun showInHolder(holderFactory: HolderFactoryType) = apply { - factory = holderFactory - } + fun setItems( + source: List, + mapper: (T) -> ItemType + ) = setItems(source.map { item -> mapper.invoke(item) }) - fun addItemDecoration(itemDecoration: RecyclerView.ItemDecoration) = apply { - binding.itemsRecycler.addItemDecoration(itemDecoration) - } + fun showInHolder(holderFactory: HolderFactoryType) = apply { + factory = holderFactory + } - fun onSelectedItemListener(listener: OnSelectedItemListener) = apply { - this@ListSelectionView.onSelectedItemChanged = listener - } + fun addItemDecoration(itemDecoration: RecyclerView.ItemDecoration) = apply { + binding.itemsRecycler.addItemDecoration(itemDecoration) + } - fun onSelectedItemsListener(listener: OnSelectedItemsListener) = apply { - this@ListSelectionView.onSelectedItemsChanged = listener - } + fun onSelectedItemListener(listener: OnSelectedItemListener) = apply { + this@ListSelectionView.onSelectedItemChanged = listener + } - fun withSelectionType(type: SelectionType) = apply { - selectionType = type - } + fun onSelectedItemsListener(listener: OnSelectedItemsListener) = apply { + this@ListSelectionView.onSelectedItemsChanged = listener + } - fun build() = apply { - binding.itemsRecycler.adapter = adapter - updateList() + fun withSelectionType(type: SelectionType) = apply { + selectionType = type + } + + fun build() = this@ListSelectionView.also { + binding.itemsRecycler.adapter = adapter + updateList() + } } } diff --git a/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/BaseSelectionViewHolder.kt b/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/BaseSelectionViewHolder.kt index a4b9af0..847bfc2 100644 --- a/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/BaseSelectionViewHolder.kt +++ b/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/BaseSelectionViewHolder.kt @@ -4,7 +4,7 @@ import android.view.View import androidx.recyclerview.widget.RecyclerView import ru.touchin.roboswag.base_filters.select_list_item.model.BaseSelectionItem -abstract class BaseSelectionViewHolder(val view: View) +abstract class BaseSelectionViewHolder(val view: View) : RecyclerView.ViewHolder(view) { abstract fun bind(item: ItemType) diff --git a/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/SelectionItemViewHolder.kt b/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/SelectionItemViewHolder.kt index 59a05c2..f08dd4b 100644 --- a/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/SelectionItemViewHolder.kt +++ b/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/SelectionItemViewHolder.kt @@ -5,27 +5,29 @@ import ru.touchin.roboswag.base_filters.databinding.SelectionItemBinding import ru.touchin.roboswag.base_filters.select_list_item.model.BaseSelectionItem import ru.touchin.roboswag.base_filters.SelectionType -class SelectionItemViewHolder(private val binding: SelectionItemBinding, - private val onItemSelectAction: (ItemType) -> Unit, - private val selectionType: SelectionType - ) : BaseSelectionViewHolder(binding.root) { +class SelectionItemViewHolder( + private val binding: SelectionItemBinding, + private val onItemSelectAction: (ItemType) -> Unit, + private val selectionType: SelectionType +) : BaseSelectionViewHolder(binding.root) { override fun bind(item: ItemType) { - binding.run { - val checkListener = View.OnClickListener { - itemRadiobutton.isChecked = true - onItemSelectAction.invoke(item.copyWithSelection(isSelected = when (selectionType) { - SelectionType.SINGLE_SELECT -> true - else -> !item.isSelected - })) - } + binding.itemTitle.text = item.title + binding.itemRadiobutton.isChecked = item.isSelected - itemTitle.text = item.title - root.setOnClickListener(checkListener) + setupCheckListener(item) + } - itemRadiobutton.setOnClickListener(checkListener) - itemRadiobutton.isChecked = item.isSelected + private fun setupCheckListener(item: ItemType) = with(binding) { + val checkListener = View.OnClickListener { + itemRadiobutton.isChecked = true + onItemSelectAction.invoke(item.copyWithSelection(isSelected = when (selectionType) { + SelectionType.SINGLE_SELECT -> true + else -> !item.isSelected + })) } + root.setOnClickListener(checkListener) + itemRadiobutton.setOnClickListener(checkListener) } } diff --git a/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/SheetSelectionAdapter.kt b/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/SheetSelectionAdapter.kt index 44df5ee..9424309 100644 --- a/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/SheetSelectionAdapter.kt +++ b/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/adapter/SheetSelectionAdapter.kt @@ -5,11 +5,11 @@ import ru.touchin.roboswag.base_filters.select_list_item.model.BaseSelectionItem import ru.touchin.roboswag.base_filters.SelectionType import ru.touchin.roboswag.recyclerview_adapters.adapters.DelegationListAdapter -class SheetSelectionAdapter( +class SheetSelectionAdapter( onItemSelectAction: (ItemType) -> Unit, selectionType: SelectionType, factory: HolderFactoryType -): DelegationListAdapter(object : DiffUtil.ItemCallback() { +) : DelegationListAdapter(object : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: BaseSelectionItem, newItem: BaseSelectionItem): Boolean = oldItem.isItemTheSame(newItem) diff --git a/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/model/BaseSelectionItem.kt b/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/model/BaseSelectionItem.kt index b19d0d0..8f59990 100644 --- a/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/model/BaseSelectionItem.kt +++ b/base-filters/src/main/java/ru/touchin/roboswag/base_filters/select_list_item/model/BaseSelectionItem.kt @@ -10,5 +10,5 @@ abstract class BaseSelectionItem( abstract fun isContentTheSame(compareItem: BaseSelectionItem): Boolean - abstract fun copyWithSelection(isSelected: Boolean): ItemType + abstract fun copyWithSelection(isSelected: Boolean): ItemType } diff --git a/base-filters/src/main/res/values/styles.xml b/base-filters/src/main/res/values/styles.xml index 3520002..380b4da 100644 --- a/base-filters/src/main/res/values/styles.xml +++ b/base-filters/src/main/res/values/styles.xml @@ -7,10 +7,7 @@