PR issues
This commit is contained in:
parent
d8dc470805
commit
bf55cc9579
|
|
@ -13,16 +13,18 @@
|
|||
### Как использовать
|
||||
``` kotlin
|
||||
val selectorView = ListSelectionView<DefaultSelectionItem, SelectionItemViewHolder<DefaultSelectionItem>>(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>` необходимо передлать `ItemType` - класс модели данных в списке, `HolderType` - класс viewHolder-а в recyclerView.
|
||||
|
|
@ -35,15 +37,16 @@ val selectorView = ListSelectionView<DefaultSelectionItem, SelectionItemViewHold
|
|||
* метод `showInHolder(HolderFactoryType<ItemType>)` используется для определения кастомного viewHolder для списка с недефолтной разметкой.
|
||||
``` kotlin
|
||||
val selectorView = ListSelectionView<TestSelectionItem, TestItemViewHolder>(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>)` можно использовать для получения списка всех элементов `ItemType` после каждого выбора
|
||||
* колбэк `onSelectedItemListener(listener: OnSelectedItemListener<ItemType>)` можно использовать для получения элемента списка `ItemType`, по которому произошел клик
|
||||
|
|
@ -80,6 +83,7 @@ val selectorView = ListSelectionView<TestSelectionItem, TestItemViewHolder>(cont
|
|||
``` kotlin
|
||||
val newContext = ContextThemeWrapper(requireContext(), R.style.Theme_Custom_FilterSelection)
|
||||
val selectorView = ListSelectionView(newContext)
|
||||
...
|
||||
.build()
|
||||
.Builder()
|
||||
...
|
||||
.build()
|
||||
```
|
||||
|
|
|
|||
|
|
@ -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") {
|
||||
|
|
|
|||
|
|
@ -13,8 +13,8 @@ import ru.touchin.roboswag.base_filters.select_list_item.adapter.SelectionItemVi
|
|||
import ru.touchin.roboswag.base_filters.select_list_item.adapter.SheetSelectionAdapter
|
||||
import ru.touchin.roboswag.base_filters.select_list_item.model.BaseSelectionItem
|
||||
|
||||
typealias OnSelectedItemListener<ItemType> = (item: ItemType) -> Unit
|
||||
typealias OnSelectedItemsListener<ItemType> = (items: List<ItemType>) -> Unit
|
||||
private typealias OnSelectedItemListener<ItemType> = (item: ItemType) -> Unit
|
||||
private typealias OnSelectedItemsListener<ItemType> = (items: List<ItemType>) -> Unit
|
||||
|
||||
/**
|
||||
* Base [ListSelectionView] to use in filters screen for choosing single or multi items in list.
|
||||
|
|
@ -25,7 +25,7 @@ typealias OnSelectedItemsListener<ItemType> = (items: List<ItemType>) -> Unit
|
|||
* @param HolderType Type of viewHolder in recyclerView.
|
||||
* It must implement [BaseSelectionViewHolder] abstract class.
|
||||
*
|
||||
**/
|
||||
**/
|
||||
|
||||
class ListSelectionView<ItemType, HolderType> @JvmOverloads constructor(
|
||||
context: Context,
|
||||
|
|
@ -33,8 +33,8 @@ class ListSelectionView<ItemType, HolderType> @JvmOverloads constructor(
|
|||
defStyleAttr: Int = 0,
|
||||
defStyleRes: Int = 0
|
||||
) : FrameLayout(context, attrs, defStyleAttr, defStyleRes)
|
||||
where ItemType: BaseSelectionItem,
|
||||
HolderType: BaseSelectionViewHolder<ItemType>{
|
||||
where ItemType : BaseSelectionItem,
|
||||
HolderType : BaseSelectionViewHolder<ItemType> {
|
||||
|
||||
private var mutableItems: List<ItemType> = emptyList()
|
||||
private var selectionType = SelectionType.SINGLE_SELECT
|
||||
|
|
@ -82,38 +82,41 @@ class ListSelectionView<ItemType, HolderType> @JvmOverloads constructor(
|
|||
updateList()
|
||||
}
|
||||
|
||||
fun setItems(items: List<ItemType>) = apply {
|
||||
mutableItems = items
|
||||
}
|
||||
inner class Builder {
|
||||
|
||||
fun <T> setItems(
|
||||
source: List<T>,
|
||||
mapper: (T) -> ItemType
|
||||
) = setItems(source.map { item -> mapper.invoke(item) })
|
||||
fun setItems(items: List<ItemType>) = apply {
|
||||
mutableItems = items
|
||||
}
|
||||
|
||||
fun showInHolder(holderFactory: HolderFactoryType<ItemType>) = apply {
|
||||
factory = holderFactory
|
||||
}
|
||||
fun <T> setItems(
|
||||
source: List<T>,
|
||||
mapper: (T) -> ItemType
|
||||
) = setItems(source.map { item -> mapper.invoke(item) })
|
||||
|
||||
fun addItemDecoration(itemDecoration: RecyclerView.ItemDecoration) = apply {
|
||||
binding.itemsRecycler.addItemDecoration(itemDecoration)
|
||||
}
|
||||
fun showInHolder(holderFactory: HolderFactoryType<ItemType>) = apply {
|
||||
factory = holderFactory
|
||||
}
|
||||
|
||||
fun onSelectedItemListener(listener: OnSelectedItemListener<ItemType>) = apply {
|
||||
this@ListSelectionView.onSelectedItemChanged = listener
|
||||
}
|
||||
fun addItemDecoration(itemDecoration: RecyclerView.ItemDecoration) = apply {
|
||||
binding.itemsRecycler.addItemDecoration(itemDecoration)
|
||||
}
|
||||
|
||||
fun onSelectedItemsListener(listener: OnSelectedItemsListener<ItemType>) = apply {
|
||||
this@ListSelectionView.onSelectedItemsChanged = listener
|
||||
}
|
||||
fun onSelectedItemListener(listener: OnSelectedItemListener<ItemType>) = apply {
|
||||
this@ListSelectionView.onSelectedItemChanged = listener
|
||||
}
|
||||
|
||||
fun withSelectionType(type: SelectionType) = apply {
|
||||
selectionType = type
|
||||
}
|
||||
fun onSelectedItemsListener(listener: OnSelectedItemsListener<ItemType>) = 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()
|
||||
}
|
||||
}
|
||||
|
||||
enum class SelectionType { SINGLE_SELECT, MULTI_SELECT }
|
||||
|
|
|
|||
|
|
@ -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<ItemType: BaseSelectionItem>(val view: View)
|
||||
abstract class BaseSelectionViewHolder<ItemType : BaseSelectionItem>(val view: View)
|
||||
: RecyclerView.ViewHolder(view) {
|
||||
|
||||
abstract fun bind(item: ItemType)
|
||||
|
|
|
|||
|
|
@ -5,27 +5,29 @@ import ru.touchin.roboswag.base_filters.databinding.SelectionItemBinding
|
|||
import ru.touchin.roboswag.base_filters.select_list_item.ListSelectionView
|
||||
import ru.touchin.roboswag.base_filters.select_list_item.model.BaseSelectionItem
|
||||
|
||||
class SelectionItemViewHolder<ItemType: BaseSelectionItem>(private val binding: SelectionItemBinding,
|
||||
private val onItemSelectAction: (ItemType) -> Unit,
|
||||
private val selectionType: ListSelectionView.SelectionType
|
||||
) : BaseSelectionViewHolder<ItemType>(binding.root) {
|
||||
class SelectionItemViewHolder<ItemType : BaseSelectionItem>(
|
||||
private val binding: SelectionItemBinding,
|
||||
private val onItemSelectAction: (ItemType) -> Unit,
|
||||
private val selectionType: ListSelectionView.SelectionType
|
||||
) : BaseSelectionViewHolder<ItemType>(binding.root) {
|
||||
|
||||
override fun bind(item: ItemType) {
|
||||
binding.run {
|
||||
val checkListener = View.OnClickListener {
|
||||
itemRadiobutton.isChecked = true
|
||||
onItemSelectAction.invoke(item.copyWithSelection(isSelected = when (selectionType) {
|
||||
ListSelectionView.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) {
|
||||
ListSelectionView.SelectionType.SINGLE_SELECT -> true
|
||||
else -> !item.isSelected
|
||||
}))
|
||||
}
|
||||
root.setOnClickListener(checkListener)
|
||||
itemRadiobutton.setOnClickListener(checkListener)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,11 +5,11 @@ import ru.touchin.roboswag.base_filters.select_list_item.ListSelectionView
|
|||
import ru.touchin.roboswag.base_filters.select_list_item.model.BaseSelectionItem
|
||||
import ru.touchin.roboswag.recyclerview_adapters.adapters.DelegationListAdapter
|
||||
|
||||
class SheetSelectionAdapter<ItemType: BaseSelectionItem>(
|
||||
class SheetSelectionAdapter<ItemType : BaseSelectionItem>(
|
||||
onItemSelectAction: (ItemType) -> Unit,
|
||||
selectionType: ListSelectionView.SelectionType,
|
||||
factory: HolderFactoryType<ItemType>
|
||||
): DelegationListAdapter<BaseSelectionItem>(object : DiffUtil.ItemCallback<BaseSelectionItem>() {
|
||||
) : DelegationListAdapter<BaseSelectionItem>(object : DiffUtil.ItemCallback<BaseSelectionItem>() {
|
||||
|
||||
override fun areItemsTheSame(oldItem: BaseSelectionItem, newItem: BaseSelectionItem): Boolean =
|
||||
oldItem.isItemTheSame(newItem)
|
||||
|
|
|
|||
|
|
@ -10,5 +10,5 @@ abstract class BaseSelectionItem(
|
|||
|
||||
abstract fun isContentTheSame(compareItem: BaseSelectionItem): Boolean
|
||||
|
||||
abstract fun <ItemType>copyWithSelection(isSelected: Boolean): ItemType
|
||||
abstract fun <ItemType> copyWithSelection(isSelected: Boolean): ItemType
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,10 +7,7 @@
|
|||
</style>
|
||||
|
||||
<style name="Widget.FilterSelection.Item" parent="@style/Widget.MaterialComponents.TextView">
|
||||
<item name="android:layout_marginStart">16dp</item>
|
||||
<item name="android:layout_marginEnd">16dp</item>
|
||||
<item name="android:layout_marginTop">16dp</item>
|
||||
<item name="android:layout_marginBottom">16dp</item>
|
||||
<item name="android:layout_margin">16dp</item>
|
||||
</style>
|
||||
|
||||
<style name="Widget.FilterSelection.Radio" parent="@style/Widget.MaterialComponents.CompoundButton.RadioButton">
|
||||
|
|
|
|||
Loading…
Reference in New Issue