liangjingkanji / BRV

[使用文档] Android 快速构建 RecyclerView, 比 BRVAH 更简单强大
http://liangjingkanji.github.io/BRV/
MIT License
2.62k stars 330 forks source link

多类型能否支持SpanSize设置 #80

Closed xiaoxiaohaozai closed 2 years ago

liangjingkanji commented 2 years ago

SpanSize由GridLayoutManager控制, 多类型由BindingAdapter控制, 两者没什么关系可以一起使用

xiaoxiaohaozai commented 2 years ago

SpanSize由GridLayoutManager控制, 多类型由BindingAdapter控制, 两者没什么关系可以一起使用

我想通过一个Recyclerview 来实现复杂布局,当布局类型是网格或者瀑布流时,可以通过spansize 或者fullSpan 来控制item的宽度 ,可以参考 https://www.jianshu.com/p/60aa2fc17870

liangjingkanji commented 2 years ago

支持, 这就是很简单的GridLayoutManager多类型实现

Demo里面有用这个实现分组, 你可以看下

xiaoxiaohaozai commented 2 years ago

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(R.layout.home_layout_banner) addType(R.layout.home_layout_wx_grid) addType(R.layout.home_layout_category_item) addType(R.layout.home_layout_project_title) addType(R.layout.home_layout_project_item)

                //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
                        }
                    }
                }
liangjingkanji commented 2 years ago

这就是和BRVAH一样的写法 image

但是我不推荐, 数据处理交由Model, 而创建内嵌rv我推荐还是在Activity中创建, 如果复杂化了你抽出函数即可

xiaoxiaohaozai commented 2 years ago

这就是和BRVAH一样的写法 image

但是我不推荐, 数据处理交由Model, 而创建内嵌rv我推荐还是在Activity中创建, 如果复杂化了你抽出函数即可

好的,我尝试一下,麻烦了

xiaoxiaohaozai commented 2 years ago

尝试后成功了,但是添加divider 会报错 ,不添加正常显示 飞书20211223-191617 飞书20211223-191624 飞书20211223-191620

xiaoxiaohaozai commented 2 years ago

提供的demo添加后也崩溃了

liangjingkanji commented 2 years ago

得在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
        }
    }
}
liangjingkanji commented 2 years ago

另外能item最好优先自己处理的分割线需求, 问题会少很多, 性能也更好