跳转至

悬停

通过实现接口ItemHover

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

然后这个Item就会悬停在顶部了

完整示例

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    rv.linear().setup {
        addType<Model>(R.layout.item_multi_type_simple)
        addType<HoverHeaderModel>(R.layout.item_hover_header)
        models = getData()

        // 点击事件
        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)
            }
        }

    }
}

不同于大部分悬停框架, BRV无需特殊处理支持全部的点击事件

[BindingAdapter] 判断当前位置是否属于悬停

fun isHover(position: Int): Boolean

网格悬停

Demo截图

可以看到图片中悬停的item比普通的item要宽两倍, 这里需要确定悬停的Item的动态SpanSize, 所以不能直接使用grid(3)而是需要手动创建HoverGridLayoutManager

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