跳转至

悬停

悬停条目又常被称为粘性头部

示例代码

Model实现接口ItemHover

class HoverHeaderModel : ItemHover {
    // 返回值决定是否悬停
    override var itemHover: Boolean = true
}

监听悬停事件

rv.linear().setup {
    addType<Model>(R.layout.item_simple)
    addType<HoverHeaderModel>(R.layout.item_hover_header)

    // 点击事件
    onClick(R.id.item) {
        when (itemViewType) {
            R.layout.item_hover_header -> toast("悬停条目")
            else -> toast("普通条目")
        }
    }

    // 可选项, 粘性监听器
    onHoverAttachListener = object : OnHoverAttachListener {
        // 黏住顶部的时候, v表示指定悬停的itemView对象
        override fun attachHover(v: View) {
            ViewCompat.setElevation(v, 10F)
        }

        // 从顶部分离的时候
        override fun detachHover(v: View) {
            ViewCompat.setElevation(v, 0F)
        }
    }

}
}.models = getData()

支持点击事件

不同于大部分框架实现的悬停, BRV支持全部的点击/长按事件

网格悬停

可以看到图中悬停的item比普通item要宽两倍, 所以需要返回动态SpanSize

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 // 具体处理由开发者确定
    }
}
rv.layoutManager = layoutManager