• Android 组件 —— 流式布局


    简介

    这是一个Android流式布局,根据鸿翔大神之前写的FlowLayout设计思路结合Material库中的ChipGroup设计架构衍生而来,全新的流式布局TagFlowLayout组件

    效果展示

    在这里插入图片描述

    方法

    setter

    方法名称作用示例
    setTagSpacingHorizontal(@Dimension tagSpacingHorizontal: Int)Tag间的水平间距setTagSpacingHorizontal(24)
    setTagSpacingVertical(@Dimension tagSpacingVertical: Int)Tag间的垂直间距setTagSpacingVertical(24)
    setSingleLine(singleLine: Boolean)是否开启单行模式(默认false)setSingleLine(true)
    setSingleSelection(singleSelection: Boolean)是否开启单选模式(默认false)setSingleSelection(true)
    setSelectionRequired(selectionRequired: Boolean)是否为必选项(默认falsesetSelectionRequired(true)
    setSelectMax(selectMax: Int)最大选择数量(<=0为无效值setSelectMax(10)
    setOnTagClickListener(tagClickListener: TagClickListener)设置Tag点击事件setOnTagClickListener { view, position, parent -> }
    setCheckedChangedListener(checkedChangedListener: CheckedChangedListener)设置Tag状态变更监听事件setCheckedChangedListener { group, checkedIds -> }

    getter

    方法名称作用返回类型
    isSelectMax()是否达到最大的选择数量Boolean
    clearCheck()清除所有选中数据void
    getCheckedTagOrder()获取选中单选下标Int
    getCheckedTagOrders()获取选中集合下标组List

    Attributes属性

    属性名称作用示例
    app:tagSpacingTag间的间距app:tagSpacing="24dp"
    app:tagSpacingHorizontalTag间的水平间距app:tagSpacingHorizontal="24dp"
    app:tagSpacingVerticalTag间的垂直间距app:tagSpacingVertical="24dp"
    app:singleLine是否开启单行模式(默认false)app:singleLine="true"
    app:singleSelection是否开启单选模式(默认false)app:是否开启单选模式="true"
    app:selectionRequired是否为必选项(默认false)app:selectionRequired="true"
    app:selectMax最大选择数量(<=0为无效值)app:selectMax="10"

    用法

    dependencies {
        implementation 'io.github.smallmarker:tagflowlayout:1.0'
    }
    
    • 1
    • 2
    • 3

    声明

    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Adapter

    方法属性

    • 创建Adapter:TagFlowAdapter.create(dataList)
    • 设置Tag:setView(parent: TagFlowLayout, position: Int, t: T)
    • 设置Tag状态:setChecked(position: Int, t: T)
    • 监听状态变化:setCheckedChanged(isChecked: Boolean, position: Int, view: View)
    • 刷新适配器:notifyDataSetChange()

    使用步骤

    • 设置数据
            // 设置Adapter
            binding.tagFlowLayout.adapter = TagFlowAdapter.create(dataList) {
                setView { parent, position, t ->
                    TextView(parent.context).apply {
                        text = t
                        setBackgroundResource(R.drawable.bg_tag_selector)
                        setPadding(10, 10, 10, 10)
                    }
                }
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 选中状态

    支持通过state=checked来控制选中和取消

    
        
            
                
                
            
        
        
            
                
                
            
        
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    也可以自己在AdaptersetCheckedChanged处理显示

    setCheckedChanged { isChecked, position, view ->
                    Log.d("TAG", "当前TAG状态:${isChecked}, ${position}")
                    view.setBackgroundColor(if (isChecked) {
                        Color.RED
                    } else {
                        Color.GRAY
                    })
                }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 事件
            // 点击事件
            binding.tagFlowLayout.setOnTagClickListener { view, position, parent ->
                Log.d("TAG", "当前选中TAG: ${position}")
            }
    
            // 状态监听
            binding.tagFlowLayout.setCheckedChangedListener { group, checkedIds ->
                binding.tvTip.text = "当前选中TAG序号:${checkedIds}"
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    总结

    偶然发现material库中chip组件,其通过ChipGroup实现流式布局的设计,加上很早之前有用过鸿神的FlowLayout库,所以就在此基础上写了一个新的流式布局组件,该组件在类的命名上还是沿用了鸿神之前的FlowLayout,为了不依赖material库的较高版本的限制,故将需要用到的类抽取使用,做兼容处理

  • 相关阅读:
    PX4实战之旅(五):利用T265实现室内定点飞行
    智能合约语言(eDSL)—— 并行化方案
    RK3568 RTL8821cs适配 WPA3连接 与 WPA3热点配置
    MySQL数据库基本操作
    Redis 连接管理手册
    开学季征文 | 百尺竿头,我们都要更进一步
    HashMap 这套八股,不得背个十来遍?
    Linux系统下安装和卸载Redis
    注释之背后:代码的解释者与保护者
    美团前端一面必会手写面试题汇总
  • 原文地址:https://blog.csdn.net/zl_china/article/details/126022856