Hover
To achieve the sticky header effect, you can implement the ItemHover interface:
class HoverHeaderModel : ItemHover {
override var itemHover: Boolean = true
}
By setting itemHover to true, the item will stick to the top.
Here's a complete example:
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
rv.linear().setup {
addType<Model>(R.layout.item_simple)
addType<HoverHeaderModel>(R.layout.item_hover_header)
models = getData()
// Click event
onClick(R.id.item) {
when (itemViewType) {
R.layout.item_hover_header -> toast("Sticky item")
else -> toast("Regular item")
}
}
// Optional: Sticky listener
onHoverAttachListener = object : OnHoverAttachListener {
// When attaching to the top, v represents the sticky itemView
override fun attachHover(v: View) {
ViewCompat.setElevation(v, 10F)
}
// When detaching from the top
override fun detachHover(v: View) {
ViewCompat.setElevation(v, 0F)
}
}
}
}
Unlike most sticky frameworks, BRV doesn't require special handling to support all click events.
[BindingAdapter]: Determine if the current position belongs to a sticky item
fun isHover(position: Int): Boolean
Sticky Grid¶
Demo screenshot:

As shown in the image, the sticky item is twice as wide as regular items. To achieve this, you need to dynamically determine the SpanSize of the sticky item, so you can't directly use grid(3). Instead, you need to create a HoverGridLayoutManager manually:
val layoutManager = HoverGridLayoutManager(requireContext(), 2)
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return if(rv.bindingAdapter.isHover(position)) 2 else 1 // Specific business logic should be determined by you
}
}
rv.layoutManager = layoutManager