InstantSearch provides HierarchicalState as a state model,
which implements the HierarchicalView interface.
You need to connect HierarchicalState to the HierarchicalConnector or HierarchicalViewModel like any other HierarchicalView implementation.
Kotlin
class MyActivity : AppCompatActivity() { val searcher = HitsSearcher( applicationID = "YourApplicationID", apiKey = "YourSearchOnlyAPIKey", indexName = "YourIndexName" ) val hierarchicalCategory = "categories" val hierarchicalCategoryLvl0 = "$categories.lvl0" val hierarchicalCategoryLvl1 = "$categories.lvl1" val hierarchicalCategoryLvl2 = "$categories.lvl2" val hierarchicalAttributes = listOf( hierarchicalCategoryLvl0, hierarchicalCategoryLvl1, hierarchicalCategoryLvl2 ) val filterState = FilterState() val separator = " > " val hierarchicalState = HierarchicalState() val hierarchical = HierarchicalConnector( searcher = searcher, attribute = hierarchicalCategory, filterState = filterState, hierarchicalAttributes = hierarchicalAttributes, separator = separator ) val connections = ConnectionHandler(hierarchical) init { connections += searcher.connectFilterState(filterState) connections += hierarchical.connectView(hierarchicalState, HierarchicalPresenterImpl(separator)) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { LazyColumn { items(hierarchicalState.hierarchicalItems) { item -> HierarchicalItem( // your own UI composable to display `HierarchicalItem` item = item, onClick = { hierarchicalState.onSelectionChanged?.invoke(item.facet.value) } ) } } } searcher.searchAsync() } override fun onDestroy() { super.onDestroy() connections.disconnect() searcher.cancel() }}
How to display the list of HierarchicalItem.
Takes a list of HierarchicalItem and returns a new list of HierarchicalItem.
A HierarchicalItem contains a Facet, its level, and a displayName.
Kotlin
val view: HierarchicalView = HierarchicalAdapter()val separator = " > "val presenter = HierarchicalPresenterImpl(separator)hierarchical.connectView(view, presenter)// Example of `HierarchicalView` implementationclass HierarchicalAdapter : HierarchicalView, ListAdapter<HierarchicalItem, HierarchicalViewHolder>(DiffUtilItem()) { override var onSelectionChanged: Callback<String>? = null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HierarchicalViewHolder { return HierarchicalViewHolder(parent.inflate(R.layout.list_item_selectable, false)) } override fun onBindViewHolder(holder: HierarchicalViewHolder, position: Int) { val item = getItem(position) holder.bind(item) { onSelectionChanged?.invoke(item.facet.value) } } override fun setTree(tree: List<HierarchicalItem>) { submitList(tree) }}class DiffUtilItem<T : Filter> : DiffUtil.ItemCallback<SelectableItem<T>>() { override fun areItemsTheSame(oldItem: SelectableItem<T>, newItem: SelectableItem<T>): Boolean { return oldItem.first == newItem.first } override fun areContentsTheSame(oldItem: SelectableItem<T>, newItem: SelectableItem<T>): Boolean { return oldItem == newItem }}