{"id":28377097,"url":"https://github.com/donkingliang/labelsview","last_synced_at":"2025-06-26T18:32:17.771Z","repository":{"id":41265505,"uuid":"84190094","full_name":"donkingliang/LabelsView","owner":"donkingliang","description":"Android的标签列表控件。可以设置标签的选中效果。 可以设置标签的选中类型：不可选中、单选、限数量多选和不限数量多选等， 并支持设置必选项、单行显示、最大显示行数等功能。","archived":false,"fork":false,"pushed_at":"2023-05-09T12:10:39.000Z","size":355,"stargazers_count":1029,"open_issues_count":18,"forks_count":156,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-05-30T00:42:09.522Z","etag":null,"topics":["android","android-library","android-ui","custom-view","labels","tabs"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/donkingliang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-03-07T11:11:59.000Z","updated_at":"2025-05-07T09:04:33.000Z","dependencies_parsed_at":"2023-10-21T10:56:45.840Z","dependency_job_id":null,"html_url":"https://github.com/donkingliang/LabelsView","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/donkingliang/LabelsView","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FLabelsView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FLabelsView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FLabelsView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FLabelsView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/donkingliang","download_url":"https://codeload.github.com/donkingliang/LabelsView/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/donkingliang%2FLabelsView/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262122861,"owners_count":23262486,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-library","android-ui","custom-view","labels","tabs"],"created_at":"2025-05-30T00:39:47.319Z","updated_at":"2025-06-26T18:32:17.739Z","avatar_url":"https://github.com/donkingliang.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"LabelsView\n======\n标签列表控件的使用介绍。\n\n**1、引入依赖**\n在Project的build.gradle在添加以下代码\n```\nallprojects {\n\trepositories {\n\t\t...\n\t\tmaven { url 'https://jitpack.io' }\n\t}\n}\n```\n在Module的build.gradle在添加以下代码\n```\ndependencies {\n    implementation 'com.github.donkingliang:LabelsView:1.6.5'\n}\n```\n\n**2、编写布局：**\n\n```xml\n   \u003ccom.donkingliang.labels.LabelsView \n       xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n       android:id=\"@+id/labels\"\n       android:layout_width=\"match_parent\"\n       android:layout_height=\"wrap_content\"\n       app:labelBackground=\"@drawable/label_bg\"     //标签的背景\n       app:labelTextColor=\"@drawable/label_text_color\" //标签的字体颜色 可以是一个颜色值\n       app:labelTextSize=\"14sp\"      //标签的字体大小\n       app:labelTextPaddingBottom=\"5dp\"   //标签的上下左右边距\n       app:labelTextPaddingLeft=\"10dp\"\n       app:labelTextPaddingRight=\"10dp\"\n       app:labelTextPaddingTop=\"5dp\"\n       app:lineMargin=\"10dp\"   //行与行的距离\n       app:wordMargin=\"10dp\"   //标签与标签的距离\n       app:selectType=\"SINGLE\"   //标签的选择类型 有单选(可反选)、单选(不可反选)、多选、不可选四种类型\n       app:maxLines=\"3\"    // 设置最大显示行数，小于等于0则不限行数。\n       app:maxColumns=\"5\"  // 设置最大显示列数，小于等于0则不限行数。\n       app:maxSelect=\"5\"   //标签的最大选择数量，只有多选的时候才有用，0为不限数量\n       app:minSelect=\"1\"   //标签的最少选择数量，只有多选的时候才有用，0为不限数量\n       app:isIndicator=\"true\" /\u003e   //设置为指示器模式，不能手动改变标签的选中状态\n\n\u003c!-- 其他属性 --\u003e\napp:labelTextWidth=\"wrap_content\"  // 标签项宽\napp:labelTextHeight=\"wrap_content\"  // 标签项高\napp:labelGravity=\"center\"  // 标签项的文本显示方向\napp:labelTextPadding=\"5dp\"  // 标签的Padding\napp:singleLine=\"true\"  // 单行显示，默认false\napp:isTextBold=\"true\" // 是否粗字体，默认false\n\n```\n这里有两个地方需要说明一下：\n\n1）标签的正常样式和选中样式是通过drawable来实现的。比如下面两个drawable。\n```xml\n\u003c!-- 标签的背景 label_bg --\u003e\n\u003cselector xmlns:android=\"http://schemas.android.com/apk/res/android\"\u003e\n    \u003c!-- 标签选中时的背景 --\u003e\n    \u003citem android:state_selected=\"true\"\u003e\n        \u003cshape\u003e\n            \u003cstroke android:width=\"2dp\" android:color=\"#fb435b\" /\u003e\n            \u003ccorners android:radius=\"8dp\" /\u003e\n            \u003csolid android:color=\"@android:color/white\" /\u003e\n        \u003c/shape\u003e\n    \u003c/item\u003e\n    \u003c!-- 标签的正常背景 --\u003e\n    \u003citem\u003e\n        \u003cshape\u003e\n            \u003cstroke android:width=\"2dp\" android:color=\"#656565\" /\u003e\n            \u003ccorners android:radius=\"8dp\" /\u003e\n            \u003csolid android:color=\"@android:color/white\" /\u003e\n        \u003c/shape\u003e\n    \u003c/item\u003e\n\u003c/selector\u003e\n```\n```xml\n\u003c!-- 标签的文字颜色 label_text_color --\u003e\n\u003cselector xmlns:android=\"http://schemas.android.com/apk/res/android\"\u003e\n    \u003c!-- 标签选中时的文字颜色 --\u003e\n    \u003citem android:color=\"#fb435b\" android:state_selected=\"true\" /\u003e\n    \u003c!-- 标签的正常文字颜色 --\u003e\n    \u003citem android:color=\"#2d2b2b\" /\u003e\n\u003c/selector\u003e\n```\nTextView的textColor属性除了可以设置一个颜色值以外，也可以通过资源来设置的，这一点很多同学都不知道。\n\n2）标签的选择类型有四种：\n\n**NONE** ：标签不可选中，也不响应选中事件监听，这是默认值。\n\n**SINGLE**：单选(可反选)。这种模式下，可以一个也不选。\n\n**SINGLE_IRREVOCABLY**：单选(不可反选)。这种模式下，有且只有一个是选中的。默认是第一个。\n\n**MULTI**：多选，可以通过设置maxSelect限定选择的最大数量，0为不限数量。maxSelect只有在多选的时候才有效。多选模式下可以设置一些标签为必选项。必选项的标签默认选中，且不能取消。\n\n**3、设置标签：**\n\n```java\nlabelsView = (LabelsView) findViewById(labels);\nArrayList\u003cString\u003e label = new ArrayList\u003c\u003e();\nlabel.add(\"Android\");\nlabel.add(\"IOS\");\nlabel.add(\"前端\");\nlabel.add(\"后台\");\nlabel.add(\"微信开发\");\nlabel.add(\"游戏开发\");\nlabelsView.setLabels(label); //直接设置一个字符串数组就可以了。\n\n//LabelsView可以设置任何类型的数据，而不仅仅是String。\nArrayList\u003cTestBean\u003e testList = new ArrayList\u003c\u003e();\ntestList.add(new TestBean(\"Android\",1));\ntestList.add(new TestBean(\"IOS\",2));\ntestList.add(new TestBean(\"前端\",3));\ntestList.add(new TestBean(\"后台\",4));\ntestList.add(new TestBean(\"微信开发\",5));\ntestList.add(new TestBean(\"游戏开发\",6));\nlabelsView.setLabels(testList, new LabelsView.LabelTextProvider\u003cTestBean\u003e() {\n    @Override\n    public CharSequence getLabelText(TextView label, int position, TestBean data) {\n    \n    \t// label就是标签项，在这里可以对标签项单独设置一些属性，比如文本样式等。\n    \n    \t//根据data和position返回label需要显示的数据。\n        return data.getName();\n    }\n});\n```\n**4、设置事件监听：**(如果需要的话)\n\n```java\n//标签的点击监听\nlabelsView.setOnLabelClickListener(new LabelsView.OnLabelClickListener() {\n    @Override\n    public void onLabelClick(TextView label, Object data, int position) {\n         //label是被点击的标签，data是标签所对应的数据，position是标签的位置。\n    }\n});\n\n// 标签的长按监听\nlabelsView.setOnLabelLongClickListener(new LabelsView.OnLabelLongClickListener() {\n    @Override\n    public boolean onLabelLongClick(TextView label, Object data, int position) {\n        return false;\n    }\n});\n\n//标签的选中监听\nlabelsView.setOnLabelSelectChangeListener(new LabelsView.OnLabelSelectChangeListener() {\n    @Override\n    public void onLabelSelectChange(TextView label, Object data, boolean isSelect, int position) {\n        //label是被选中的标签，data是标签所对应的数据，isSelect是是否选中，position是标签的位置。\n    }\n});\n```\n\n**5、设置标签选中事件拦截：**(如果需要的话)\n\n当希望某个标签在特定条件下不被选中/取消选中时，可以使用事件拦截。只有用户点击改变标签选中状态时才会回调拦截，用其他方法改变时不会回调这个方法，不会被拦截。点击选中/取消选中时，拦截事件，返回true时，表示事件被拦截，不会改变标签的选中状态。\n\n```java\n//设置标签选中状态的点击改变拦截器\nlabelsView.setOnSelectChangeIntercept(new LabelsView.OnSelectChangeIntercept() {\n    @Override\n    public boolean onIntercept(TextView label, Object data, boolean oldSelect, boolean newSelect, int position) {\n        if (position == 0){\n            //拦截第一个标签的状态改变事件，不能选中和反选\n            return true;\n        } else {\n            return false;\n        }\n    }\n});\n```\n\n**6、常用方法**\n\n```java\n//设置选中标签。\n//positions是个可变类型，表示被选中的标签的位置。\n//比喻labelsView.setSelects(1,2,5);选中第1,3,5个标签。如果是单选的话，只有第一个参数有效。\npublic void setSelects(int... positions);\npublic void setSelects(List\u003cInteger\u003e positions)；\n\n//获取选中的标签(返回的是所有选中的标签的位置)。返回的是一个Integer的数组，表示被选中的标签的下标。如果没有选中，数组的size等于0。\npublic ArrayList\u003cInteger\u003e getSelectLabels();\n//获取选中的label(返回的是所有选中的标签的数据)。如果没有选中，数组的size等于0。T表示标签的数据类型。\npublic \u003cT\u003e List\u003cT\u003e getSelectLabelDatas();\n\n//取消所有选中的标签。\npublic void clearAllSelect();\n\n//设置标签的选择类型，有NONE、SINGLE、SINGLE_IRREVOCABLY和MULTI四种类型。\npublic void setSelectType(SelectType selectType);\n\n//设置最大的选择数量，只有selectType等于MULTI时有效。\npublic void setMaxSelect(int maxSelect);\n\n//设置最少的选择数量，只有selectType等于MULTI时有效。\n//注意：minSelect只限制用户手动点击取消选中时的效果。调用setSelects()、clearAllSelect()等方法改变标签的选中状态时，不受minSelect影响。\npublic void setMinSelect(int minSelect);\n\n//设置为指示器模式，只能看，不能手动操作。这种模式下，用户不能通过手动点击改变标签的选中状态。\n//但是仍然可以通过调用setSelects()、clearAllSelect()等方法改变标签的选中状态。\npublic void setIndicator(boolean indicator)\n\n//设置必选项，只有在多项模式下，这个方法才有效\npublic void setCompulsorys(int... positions)\npublic void setCompulsorys(List\u003cInteger\u003e positions)\n\n//清空必选项，只有在多项模式下，这个方法才有效\npublic void clearCompulsorys()\n\n//设置标签背景\npublic void setLabelBackgroundResource(int resId);\n\n//设置标签的文字颜色\npublic void setLabelTextColor(int color);\npublic void setLabelTextColor(ColorStateList color);\n\n//设置标签的文字大小（单位是px）\npublic void setLabelTextSize(float size);\n\n//设置标签内边距\npublic void setLabelTextPadding(int left, int top, int right, int bottom);\n\n//设置行间隔\npublic void setLineMargin(int margin);\n\n//设置标签的间隔\npublic void setWordMargin(int margin);\n\n// 设置最大显示行数，小于等于0则不限行数。\npublic void setMaxLines(int maxLines);\n\n// 设置最大显示列数，小于等于0则不限行数。\npublic void setMaxColumns(int maxColumns)\n\n// 设置标签文本显示方向\npublic void setLabelGravity(int gravity)；\n\n// 设置是否单行显示\npublic void setMaxLines(int maxLines)；\n\n// 设置标签字体是否为粗体\npublic void setTextBold(boolean isBold);\n\n// 获取标签的行数\npublic int getLines();\n```\n所有的set方法都有对应的get方法，这里就不说了。\n\n### 效果图：\n![效果图](https://github.com/donkingliang/LabelsView/blob/master/%E6%95%88%E6%9E%9C%E5%9B%BE.gif)  \n\n想要了解该控件的具体实现的同学，欢迎访问[我的博客](http://blog.csdn.net/u010177022)  \n[Android自定义标签列表控件LabelsView解析](http://blog.csdn.net/u010177022/article/details/60324117)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdonkingliang%2Flabelsview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdonkingliang%2Flabelsview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdonkingliang%2Flabelsview/lists"}