|
|
||
|---|---|---|
| .. | ||
| src/main | ||
| .gitignore | ||
| README.md | ||
| build.gradle | ||
README.md
Описание
Модуль содержит реализацию следующих типов фильтров:
- Выбор одного/нескольких из доступных значений списка
- Выбор одного/нескольких значений из перечня тегов
- Выбор минимального и максимального значения из диапозона
Использование
1. Выбор одного/нескольких из доступных значений списка
Как использовать
val selectorView = ListSelectionView<DefaultSelectionItem, SelectionItemViewHolder<DefaultSelectionItem>>(context)
.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. Для использования дефолтной реализации необходимо использовать типы<DefaultSelectionItem, SelectionItemViewHolder<DefaultSelectionItem>> - в метод
setItems(List<ItemType>)необходимо передать список объектов - метод
addItemDecoration(itemDecoration: RecyclerView.ItemDecoration)можно использовать для передачи объектаRecyclerView.ItemDecoration - метод
withSelectionType(type: SelectionType)используется для указания типа выбора:SINGLE_SELECT- по умолчанию - позволяет выбрать один выариант, при этом будет выбран всегда как минимум один вариантMULTI_SELECT- позволяет выбрать несколько вариантов из списка, при этом можно полностью выбрать все варианты и убрать выделение со всех вариантов
- метод
showInHolder(HolderFactoryType<ItemType>)используется для определения кастомного viewHolder для списка с недефолтной разметкой.
val selectorView = ListSelectionView<TestSelectionItem, TestItemViewHolder>(context)
.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, по которому произошел клик - после вызова конфигурационных методов обязательно необходимо вызать метод
build()
Кастомизация стиля дефолтной реализации ViewHolder без необходимости создания кастомного layout и viewHolder
1) Определить кастомную тему и стили элементов
- Стиль для текста элемента списка должен быть наследником стиля
Widget.FilterSelection.Item
<style name="Widget.Custom.FilterSelection.Item" parent="@style/Widget.FilterSelection.Item">
<item name="android:textAppearance">@style/Text15sp.Regular.Black</item>
<item name="android:paddingTop">2dp</item>
<item name="android:lineSpacingExtra">3sp</item>
<item name="android:translationY">-1.71sp</item>
</style>
- Стиль для индикатора выбора должен быть наследником стиля
Widget.FilterSelection.RadioПередайтеselector-drawableдля кастомизации вида индикатора в конце строки
<style name="Widget.Custom.FilterSelection.Radio" parent="@style/Widget.FilterSelection.Radio">
<item name="android:button">@drawable/selector_checkbox</item>
</style>
- Создайте тему, которая должна быть наследником
Theme.FilterSelection
<style name="Theme.Custom.FilterSelection" parent="@style/Theme.FilterSelection">
<item name="sheetSelection_itemStyle">@style/Widget.Custom.FilterSelection.Item</item>
<item name="sheetSelection_radioStyle">@style/Widget.Custom.FilterSelection.Radio</item>
</style>
2) Применить тему при создании view
При создании вью в коде можно указать тему, используя ContextThemeWrapper
val newContext = ContextThemeWrapper(requireContext(), R.style.Theme_Custom_FilterSelection)
val selectorView = ListSelectionView(newContext)
.Builder()
...
.build()
2. Выбор одного/нескольких значений из перечня тегов
TagLayoutView- view-контейнер для теговTagView- view для тега. Кастомная разметка для тега должна содержать в корнеTagView
Как использовать
binding.tagItemLayout
.Builder(getFilterItem())
.setSpacing(16)
.setSelectionType(SelectionType.MULTI_SELECT) // по умолчанию
.isSingleLine(false) // по умолчанию
.onPropertySelectedAction { filterProperty: FilterProperty ->
//Do something
}
.build()
Конфигурации
- метод
setSelectionType(SelectionType)конфигурирует тип выбора:SINGLE_SELECT- выбор одного варианта сбрасывает select у всех остальныхMULTI_SELECT- по умолчанию - мультивыбор тегов с учетом исключающих фильтров
- метод
isSingleLine(Boolean)конфигурирует вид контейнера с тегами:trueсоответствует горизонтальному контейнеру со скроллом setTagLayout(Int)устанавливает разметку для тега. Если не задано - то используется дефолтная разметкаlayout_default_tag.xmlsetMaxTagCount(Int)позволяет ограничить количество отображаемых тегов. По умолчанию ограничения нет.setMoreTagLayout(Int, String)устанавливает разметку для тега, который отображается для дополнительного тега. Если не указана - то тег не будет созданsetSpacing(Int),setSpacingHorizontal(Int)иsetSpacingVertical(Int)можно использовать для настройки расстояния между тегами. По умолчанию - 0onMoreValuesAction(FilterMoreAction)иonPropertySelectedAction(PropertySelectedAction)используются для передачи колбэков на клик по тегу типа "Еще" и обычного тега соответственно- после вызова конфигурационных методов обязательно необходимо вызать метод
build() - в Builder необходимо передать объект
filterItem: FilterItem
3. Выбор минимального и максимального значения из диапозона
RangeChoiceView- контейнер для слайдера и редактируемых полейFilterRangeSlider- слайдер - Можно использовать как отдельный элементHintInputView- view для редактируемого поля начала и окончания диапозона
Как использовать
В разметке
<ru.touchin.roboswag.base_filters.range.RangeChoiceView
android:id="@+id/range_values_test"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/FilterRangeChoice" //не забудьте указать стиль
app:layout_constraintTop_toTopOf="parent" />
Настройка в коде
fun setupValues(item: FilterRangeItem) {
binding.rangeValuesTest.setupRangeValues(
rangeFilterItem = item,
onChangeCallback = callback
)
}
fun resetValues() {
binding.rangeValuesTest.resetRangeValue()
}
Конфигурации
Вся конфигурация вьюх осуществляется через стили:
- Для
RangeChoiceView:filterRange_sliderMargin- расстояние от слайдера до редактируемых полейfilterRange_startHint- ссылка на строку с текстом подсказки в редактируемом поле для начального значенияfilterRange_endHint- ссылка на строку с текстом подсказки в редактируемом поле для конечного значенияfilterRange_theme- ссылка на тему
- В теме:
- атрибут
filterRange_sliderStyle- ссылка на стиль слайдера - атрибут
filterRange_hintViewStyle- ссылка на стильHintInputView - атрибут
filterRange_hintTextStyle- ссылка на стильTextViewвнутриHintInputView - атрибут
filterRange_valueEditTextStyle- ссылка на стильEditTextвнутриHintInputView
- атрибут
- Для
FilterRangeSlider:trackColorActivetrackColorInactivetrackHeightthumbElevationthumbColorlabelBehaviorhaloRadiusfilterRange_stepTextAppearancefilterRange_activeTickColorfilterRange_inactiveTickColorfilterRange_stepValueMarginTopfilterRange_sliderPointSizefilterRange_pointShape