Skip to content

Android的标签列表控件。可以设置标签的选中效果。 可以设置标签的选中类型:不可选中、单选、限数量多选和不限数量多选等, 并支持设置必选项、单行显示、最大显示行数等功能。

License

Notifications You must be signed in to change notification settings

LDLearnProject/LabelsView

Repository files navigation

LabelsView

标签列表控件的使用介绍。

1、引入依赖 在Project的build.gradle在添加以下代码

allprojects{repositories{... maven{url 'https://jitpack.io' } } } 

在Module的build.gradle在添加以下代码

dependencies{implementation 'com.github.donkingliang:LabelsView:1.6.5' } 

2、编写布局:

 <com.donkingliang.labels.LabelsView xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/labels"android:layout_width="match_parent"android:layout_height="wrap_content"app:labelBackground="@drawable/label_bg" //标签的背景 app:labelTextColor="@drawable/label_text_color" //标签的字体颜色 可以是一个颜色值 app:labelTextSize="14sp" //标签的字体大小 app:labelTextPaddingBottom="5dp" //标签的上下左右边距 app:labelTextPaddingLeft="10dp"app:labelTextPaddingRight="10dp"app:labelTextPaddingTop="5dp"app:lineMargin="10dp" //行与行的距离 app:wordMargin="10dp" //标签与标签的距离 app:selectType="SINGLE" //标签的选择类型 有单选(可反选)、单选(不可反选)、多选、不可选四种类型 app:maxLines="3" // 设置最大显示行数,小于等于0则不限行数。 app:maxColumns="5" // 设置最大显示列数,小于等于0则不限行数。 app:maxSelect="5" //标签的最大选择数量,只有多选的时候才有用,0为不限数量 app:minSelect="1" //标签的最少选择数量,只有多选的时候才有用,0为不限数量 app:isIndicator="true" /> //设置为指示器模式,不能手动改变标签的选中状态 <!-- 其他属性 --> app:labelTextWidth="wrap_content" // 标签项宽 app:labelTextHeight="wrap_content" // 标签项高 app:labelGravity="center" // 标签项的文本显示方向 app:labelTextPadding="5dp" // 标签的Padding app:singleLine="true" // 单行显示,默认false app:isTextBold="true" // 是否粗字体,默认false 

这里有两个地方需要说明一下:

1)标签的正常样式和选中样式是通过drawable来实现的。比如下面两个drawable。

<!-- 标签的背景 label_bg --> <selectorxmlns:android="http://schemas.android.com/apk/res/android"> <!-- 标签选中时的背景 --> <itemandroid:state_selected="true"> <shape> <strokeandroid:width="2dp"android:color="#fb435b" /> <cornersandroid:radius="8dp" /> <solidandroid:color="@android:color/white" /> </shape> </item> <!-- 标签的正常背景 --> <item> <shape> <strokeandroid:width="2dp"android:color="#656565" /> <cornersandroid:radius="8dp" /> <solidandroid:color="@android:color/white" /> </shape> </item> </selector>
<!-- 标签的文字颜色 label_text_color --> <selectorxmlns:android="http://schemas.android.com/apk/res/android"> <!-- 标签选中时的文字颜色 --> <itemandroid:color="#fb435b"android:state_selected="true" /> <!-- 标签的正常文字颜色 --> <itemandroid:color="#2d2b2b" /> </selector>

TextView的textColor属性除了可以设置一个颜色值以外,也可以通过资源来设置的,这一点很多同学都不知道。

2)标签的选择类型有四种:

NONE :标签不可选中,也不响应选中事件监听,这是默认值。

SINGLE:单选(可反选)。这种模式下,可以一个也不选。

SINGLE_IRREVOCABLY:单选(不可反选)。这种模式下,有且只有一个是选中的。默认是第一个。

MULTI:多选,可以通过设置maxSelect限定选择的最大数量,0为不限数量。maxSelect只有在多选的时候才有效。多选模式下可以设置一些标签为必选项。必选项的标签默认选中,且不能取消。

3、设置标签:

labelsView = (LabelsView) findViewById(labels); ArrayList<String> label = newArrayList<>(); label.add("Android"); label.add("IOS"); label.add("前端"); label.add("后台"); label.add("微信开发"); label.add("游戏开发"); labelsView.setLabels(label); //直接设置一个字符串数组就可以了。//LabelsView可以设置任何类型的数据,而不仅仅是String。ArrayList<TestBean> testList = newArrayList<>(); testList.add(newTestBean("Android",1)); testList.add(newTestBean("IOS",2)); testList.add(newTestBean("前端",3)); testList.add(newTestBean("后台",4)); testList.add(newTestBean("微信开发",5)); testList.add(newTestBean("游戏开发",6)); labelsView.setLabels(testList, newLabelsView.LabelTextProvider<TestBean>(){@OverridepublicCharSequencegetLabelText(TextViewlabel, intposition, TestBeandata){// label就是标签项,在这里可以对标签项单独设置一些属性,比如文本样式等。//根据data和position返回label需要显示的数据。returndata.getName()} });

4、设置事件监听:(如果需要的话)

//标签的点击监听labelsView.setOnLabelClickListener(newLabelsView.OnLabelClickListener(){@OverridepublicvoidonLabelClick(TextViewlabel, Objectdata, intposition){//label是被点击的标签,data是标签所对应的数据,position是标签的位置。 } }); // 标签的长按监听labelsView.setOnLabelLongClickListener(newLabelsView.OnLabelLongClickListener(){@OverridepublicbooleanonLabelLongClick(TextViewlabel, Objectdata, intposition){returnfalse} }); //标签的选中监听labelsView.setOnLabelSelectChangeListener(newLabelsView.OnLabelSelectChangeListener(){@OverridepublicvoidonLabelSelectChange(TextViewlabel, Objectdata, booleanisSelect, intposition){//label是被选中的标签,data是标签所对应的数据,isSelect是是否选中,position是标签的位置。 } });

5、设置标签选中事件拦截:(如果需要的话)

当希望某个标签在特定条件下不被选中/取消选中时,可以使用事件拦截。只有用户点击改变标签选中状态时才会回调拦截,用其他方法改变时不会回调这个方法,不会被拦截。点击选中/取消选中时,拦截事件,返回true时,表示事件被拦截,不会改变标签的选中状态。

//设置标签选中状态的点击改变拦截器labelsView.setOnSelectChangeIntercept(newLabelsView.OnSelectChangeIntercept(){@OverridepublicbooleanonIntercept(TextViewlabel, Objectdata, booleanoldSelect, booleannewSelect, intposition){if (position == 0){//拦截第一个标签的状态改变事件,不能选中和反选returntrue} else{returnfalse} } });

6、常用方法

//设置选中标签。//positions是个可变类型,表示被选中的标签的位置。//比喻labelsView.setSelects(1,2,5);选中第1,3,5个标签。如果是单选的话,只有第一个参数有效。publicvoidsetSelects(int... positions); publicvoidsetSelects(List<Integer> positions); //获取选中的标签(返回的是所有选中的标签的位置)。返回的是一个Integer的数组,表示被选中的标签的下标。如果没有选中,数组的size等于0。publicArrayList<Integer> getSelectLabels(); //获取选中的label(返回的是所有选中的标签的数据)。如果没有选中,数组的size等于0。T表示标签的数据类型。public <T> List<T> getSelectLabelDatas(); //取消所有选中的标签。publicvoidclearAllSelect(); //设置标签的选择类型,有NONE、SINGLE、SINGLE_IRREVOCABLY和MULTI四种类型。publicvoidsetSelectType(SelectTypeselectType); //设置最大的选择数量,只有selectType等于MULTI时有效。publicvoidsetMaxSelect(intmaxSelect); //设置最少的选择数量,只有selectType等于MULTI时有效。//注意:minSelect只限制用户手动点击取消选中时的效果。调用setSelects()、clearAllSelect()等方法改变标签的选中状态时,不受minSelect影响。publicvoidsetMinSelect(intminSelect); //设置为指示器模式,只能看,不能手动操作。这种模式下,用户不能通过手动点击改变标签的选中状态。//但是仍然可以通过调用setSelects()、clearAllSelect()等方法改变标签的选中状态。publicvoidsetIndicator(booleanindicator) //设置必选项,只有在多项模式下,这个方法才有效publicvoidsetCompulsorys(int... positions) publicvoidsetCompulsorys(List<Integer> positions) //清空必选项,只有在多项模式下,这个方法才有效publicvoidclearCompulsorys() //设置标签背景publicvoidsetLabelBackgroundResource(intresId); //设置标签的文字颜色publicvoidsetLabelTextColor(intcolor); publicvoidsetLabelTextColor(ColorStateListcolor); //设置标签的文字大小(单位是px)publicvoidsetLabelTextSize(floatsize); //设置标签内边距publicvoidsetLabelTextPadding(intleft, inttop, intright, intbottom); //设置行间隔publicvoidsetLineMargin(intmargin); //设置标签的间隔publicvoidsetWordMargin(intmargin); // 设置最大显示行数,小于等于0则不限行数。publicvoidsetMaxLines(intmaxLines); // 设置最大显示列数,小于等于0则不限行数。publicvoidsetMaxColumns(intmaxColumns) // 设置标签文本显示方向publicvoidsetLabelGravity(intgravity); // 设置是否单行显示publicvoidsetMaxLines(intmaxLines); // 设置标签字体是否为粗体publicvoidsetTextBold(booleanisBold); // 获取标签的行数publicintgetLines();

所有的set方法都有对应的get方法,这里就不说了。

效果图:

效果图

想要了解该控件的具体实现的同学,欢迎访问我的博客
Android自定义标签列表控件LabelsView解析

About

Android的标签列表控件。可以设置标签的选中效果。 可以设置标签的选中类型:不可选中、单选、限数量多选和不限数量多选等, 并支持设置必选项、单行显示、最大显示行数等功能。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java100.0%