Closed xiaoxiaohaozai closed 2 years ago
SpanSize由GridLayoutManager控制, 多类型由BindingAdapter控制, 两者没什么关系可以一起使用
我想通过一个Recyclerview 来实现复杂布局,当布局类型是网格或者瀑布流时,可以通过spansize 或者fullSpan 来控制item的宽度 ,可以参考 https://www.jianshu.com/p/60aa2fc17870
支持, 这就是很简单的GridLayoutManager多类型实现
Demo里面有用这个实现分组, 你可以看下
SpanSize由GridLayoutManager控制, 多类型由BindingAdapter控制, 两者没什么关系可以一起使用
我想通过一个Recyclerview 来实现复杂布局,当布局类型是网格或者瀑布流时,可以通过spansize 或者fullSpan 来控制item的宽度 ,可以参考 https://www.jianshu.com/p/60aa2fc17870
另外,我发现当布局类型类特别多时(包含嵌套情况),需要写很多的if else 希望可以提供brvan Provider的形式,将某种类型的配置隔离开
类似 adapter = createAdapter { withType(Item::class.java, R.layout.item_eyepetizer_home) { // Bind data with viewholder. onBind { helper, item -> helper.setText(R.id.tv_title, item.data.title) helper.setText(R.id.tv_sub_title, item.data.author?.name + " | " + item.data.category) helper.loadCover(requireContext(), R.id.iv_cover, item.data.cover?.homepage, R.drawable.recommend_summary_card_bg_unlike) helper.loadRoundImage(requireContext(), R.id.ivauthor, item.data.author?.icon, R.mipmap.eyepetizer, 20f.dp2px()) } // Item level click and long click events. onItemClick { , _, position -> adapter?.getItem(position)?.let { toast("Clicked item: " + it.data.title) } } } }
现在 我自己的写的demo
adapter = binding.recyclerview.linear()
.divider(R.drawable.divider_horizontal)
.setupExt {
//设置支持的布局类型
addType
//onCreateViewHolder执行时回调
onCreate {
//嵌套在这里使用
when (it) {
R.layout.home_layout_banner -> {
val binding = HomeLayoutBannerBinding.bind(itemView)
binding.banner.setAdapter(object : BannerImageAdapter<BannerData>(emptyList()) {
override fun onBindView(holder: BannerImageHolder, data: BannerData, position: Int, size: Int) {
holder.imageView.load(data.imagePath)
}
}).indicator = CircleIndicator(context)
}
R.layout.home_layout_wx_grid -> {
val binding = HomeLayoutWxGridBinding.bind(itemView)
binding.rv.grid(4).setup {
addType<WxData>(R.layout.home_layout_wx_item)
onBind {
val itemBinding = HomeLayoutWxItemBinding.bind(itemView)
itemBinding.tvName.text = getModel<WxData>().name
}
}
binding.rv.isNestedScrollingEnabled = false
}
}
}
//onBindViewHolder执行时回调
onBind {
when (itemViewType) {
R.layout.home_layout_banner -> {
val binding = HomeLayoutBannerBinding.bind(itemView)
binding.banner.adapter.setDatas(getModel<BannerUIModel>().items)
}
R.layout.home_layout_wx_grid -> {
val binding = HomeLayoutWxGridBinding.bind(itemView)
(binding.rv.adapter as BindingAdapter).models = getModel<WxUIModel>().items
}
R.layout.home_layout_category_item -> {
}
R.layout.home_layout_project_title -> {
}
R.layout.home_layout_project_item -> {
val binding = HomeLayoutProjectItemBinding.bind(itemView)
val data = getModel<HotProjectItemData>()
binding.iv.load(data.envelopePic)
binding.tvName.text = data.desc
}
}
}
这就是和BRVAH一样的写法
但是我不推荐, 数据处理交由Model, 而创建内嵌rv我推荐还是在Activity中创建, 如果复杂化了你抽出函数即可
这就是和BRVAH一样的写法
但是我不推荐, 数据处理交由Model, 而创建内嵌rv我推荐还是在Activity中创建, 如果复杂化了你抽出函数即可
好的,我尝试一下,麻烦了
尝试后成功了,但是添加divider 会报错 ,不添加正常显示
提供的demo添加后也崩溃了
得在spanSizeLook里面判断不为-1, demo我有更新
layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
if (position < 0) return 1 // 小于0返回
// 根据类型设置列表item跨度
return when (binding.rv.bindingAdapter.getItemViewType(position)) {
R.layout.item_multi_type_simple -> 1 // 设置指定类型的跨度为1, 假设spanCount为2则代表此类型占据宽度为二分之一
else -> 2
}
}
}
另外能item最好优先自己处理的分割线需求, 问题会少很多, 性能也更好
SpanSize由GridLayoutManager控制, 多类型由BindingAdapter控制, 两者没什么关系可以一起使用