本发明涉及树型显示交互技术领域,具体说是一种无限层级树控件的实现。
背景技术:
现有的android系统中,某些项目开发要求采用树型显示交互,即,需要使用树形显示控件,例如:展示一个文件系统,再例如:某些菜单的展示使用多层次的树形结构。
android系统提供了可扩展的下拉列表expandablelistview,它的可扩展性在于点击父item可以拉下或收起列表,亦称为可折叠列表。可扩展的下拉列表expandablelistview是listview的子类,在listview的基础上它把应用中的列表项分为几组,每组里又可包含多个列表项。
可扩展的下拉列表expandablelistview的不足之处在于:只支持两级结构,数据结构也很复杂,使用起来很不方便。
技术实现要素:
针对现有技术中存在的缺陷,本发明的目的在于提供一种无限层级树控件的实现,采用自定义控件,实现了多层次、多数据类型的树形控件模块,无限层级,使用方便,用户体验好。
为达到以上目的,本发明采取的技术方案是:
一种无限层级树控件的实现,其特征在于,包括如下步骤:
步骤1,定义类节点basenode<t>,继承android系统提供的object类型,为树形的基本节点类型;
类节点basenode中包括至少一个泛型变量;
类节点basenode中包括添加子节点的方法addchild,获取展开可见的子节点数据的方法getvisiblechildnode;
步骤2,定义适配器抽象类basetreeadapter,继承android系统提供的recyclerview.adapter;
在适配器抽象类basetreeadapter中,定义方法filterrootdata,用来遍历排序组合填充节点数据和获取最外层的父节点,
在适配器抽象类basetreeadapter中,定义方法filtervisibledata,用来获取所有可见的子节点数据集合,
在适配器抽象类basetreeadapter中,定义方法expandorclose,用来展开和关闭当前节点布局,
步骤3,定义类适配器simpletreeadapter,继承自定义抽象适配器类basetreeadapter,通过重写以下相关的方法来实现多层级树形结构布局;
重写适配器simpletreeadapter类中的oncreateviewholder方法,用来生成创建布局显示控件。
在上述技术方案的基础上,步骤1中,所述类节点basenode<t>具体包括:
变量id、pid和type,都是android系统提供的int类型的基础数据变量,用来标识节点id、节点的父id和节点的类型,
变量parent,是自定义basenode类型的变量,用来保存节点的父节点,
变量childs,是android系统提供的list集合类型的变量,用来保存当前节点的子节点,
变量isexpand,是android系统提供的boolean类型的变量,用来标记当前节点的展开状态,
变量data,是泛型变量,用来扩展数据的节点不同的数据类型结构。
在上述技术方案的基础上,步骤2中,所述适配器抽象类basetreeadapter具体包括:
变量mrootdata,是android系统提供的list集合类型的变量,用来保存最外层根节点,
变量mvisibledata,是android系统提供的list集合类型的变量,用来保存展开可见的节点。
在上述技术方案的基础上,步骤3中,为提升性能、避免过多的对象创建,定义适配器simpletreeadapter类中的内部类viewholder,用来存储xml文件生成实例化好的布局对象,具体包括:
变量micon,是android系统提供的imageview图片控件类型的变量,用来显示层级树形节点前展开和关闭时不同的状态,
变量mtext,是android系统提供的文字展示控件textview类型的变量,用来加载层级数据节点的字体内容。
本发明所述的无限层级树控件的实现,采用自定义控件,实现了多层次、多数据类型的树形控件模块,无限层级,使用方便,用户体验好。
本发明所述的无限层级树控件的实现,采用android系统recycleview实现数据列表的展示和view的回收再利用,自定义节点数据结构,对节点数据进行排序填充和过滤并根据节点的不同状态显示展开或收拢。
附图说明
本发明有如下附图:
图1本发明的流程图。
图2无限层级树实现的效果示意图。
具体实施方式
以下结合附图对本发明作进一步详细说明。
如图1、2所示,本发明所述的无限层级树控件的实现,包括如下步骤:
步骤1,定义类节点basenode<t>,继承android系统提供的object类型,为树形的基本节点类型;
类节点basenode中包括至少一个泛型变量,使用泛型目的在于自定义节点内的数据类型,增强扩展性;
类节点basenode中包括添加子节点的方法addchild,获取展开可见的子节点数据的方法getvisiblechildnode;
方法addchild可采用以下代码实现:
publicvoidaddchild(basenodechild){
childs.add(child);
}
publiclist<basenode>getvisiblechildnode(){
list<basenode>nodes=newarraylist<>();
if(isexpand&&childs!=null&&childs.size()>0){
for(basenodeitem:childs){
nodes.add(item);
nodes.addall(item.getvisiblechildnode());
}
}
returnnodes;
}
其中:
child是定义的basenode节点类型的变量,代表将要插入的节点,
childs是该节点所包含的子节点,
add是android系统提供list集合中的方法,用来向集合中添加数据,这里用来添加子节点,
getvisiblechildnode是用来获取可见的子节点,
nodes是android系统提供的list集合类型的变量用来保存可见的子节点,
isexpand是android系统提供布尔boolean类型的变量用来标记当前节点是否处于展开状态,
childs是子节点集合列表,
add和addall方法是android系统list集合提供的方法用来向集合中添加一条和多条数据,这里用来把可见的节点添加到集合中,
步骤2,定义适配器抽象类basetreeadapter,继承android系统提供的recyclerview.adapter;
在适配器抽象类basetreeadapter中,定义方法filterrootdata,用来遍历排序组合填充节点数据和获取最外层的父节点,
方法filterrootdata可采用以下代码实现:
staticlist<basenode>filterrootdata(list<basenode>alldata){
sparsearray<basenode>map=newsparsearray<>(alldata.size());
for(basenodenode:alldata){
map.put(node.getid(),node);
}
list<basenode>root=newarraylist<>();
for(basenodenode:alldata){
if(node.gettype()!=0){
basenodep=map.get(node.getpid());
p.addchild(node);
}else{
root.add(node);
}
}
returnroot;
}
其中:
alldata是android系统提供的list集合类型的变量,用来保存添加的所有节点,
map是android系统提供的sparearray类型数据结构的变量,用来存放key为int类型的键值对,相比android系统提供的map数据结构节省内存,其中put和get是它里面的方法,用来添加节点和获取节点,
root是android系统提供的list集合类型的变量用来保存所有的最外层父节点,
for循环遍历所有节点,把节点插入到相应的位置排序整理;
在适配器抽象类basetreeadapter中,定义方法filtervisibledata,用来获取所有可见的子节点数据集合,
方法filtervisibledata可采用以下代码实现:
staticlist<basenode>filtervisibledata(list<basenode>root){
list<basenode>visibledata=newarraylist<>();
for(basenodenode:root){
visibledata.add(node);
visibledata.addall(node.getvisiblechildnode());
}
returnvisibledata;
}
其中:
root是整理排序好的所有最外层的父节点,
visibledata是android系统提供的list集合类型的变量用来添加保存所有可见的子节点,add和addall是其中的方法用来添加单个可见的父节点和父节点下所有可见的子节点;
在适配器抽象类basetreeadapter中,定义方法expandorclose,用来展开和关闭当前节点布局,
方法expandorclose可采用以下代码实现:
protectedvoidexpandorclose(basenodenode){
if(node.getchilds()!=null&&node.getchilds().size()>0){
node.setexpand(!node.isexpand());
mvisibledata=visibledata(mrootdata);
notifydatasetchanged();
}
}
其中:
node是自定义的basenode类型的变量,是传入的节点数据,用来展开和关闭当前节点,
getchilds是其中的方法用来获取其中的子节点,用来判断当前节点是否包含有子节点,
isexpand也是其中的方法返回的是布尔类型的变量用来判断当前节点是否处于展开状态,
setexpand方法用来设置当前节点的状态如果展开则关闭,否则展开,
visibledata是配器抽象类basetreeadapter中的方法用来获取所有可见的节点数据结合,
notifydatasetchanged方法是android系统提供的recyclerview.adapter类中的方法,用来通知适配器数据改变了需要刷新ui;
步骤3,定义类适配器simpletreeadapter,继承自定义抽象适配器类basetreeadapter,通过重写以下相关的方法来实现多层级树形结构布局;
重写适配器simpletreeadapter类中的oncreateviewholder方法,用来生成创建布局显示控件;
oncreateviewholder方法可采用以下代码实现:
publicrecyclerview.viewholderoncreateviewholder(viewgroupparent,intviewtype){
viewview=layoutinflater.from(parent.getcontext()).inflate(r.layout.list_item,parent,false);
view.setonclicklistener(this);
returnnewviewholder(view);
}
其中:
parent是android系统提供的容器viewgroup类型的参数,这里用来获取android系统提供的context上下文对象和实例化xml文件的布局,
layoutinflater是android系统提供的布局服务用来加载xml文件生成对应的布局对象实例,from是其中的方法用来获取layoutinflater服务对象,
getcontext是android系统view中的方法用来获取上下文对象,
r.layout.list_item是在layout文件夹下定义好的布局文件,
setonclicklistener是android系统提供的view对象中的方法用来设置点击监听器,这里用来监听每个节点的点击事件。
在上述技术方案的基础上,步骤1中,所述类节点basenode<t>具体包括:
变量id、pid和type,都是android系统提供的int类型的基础数据变量,用来标识节点id、节点的父id和节点的类型,
变量parent,是自定义basenode类型的变量,用来保存节点的父节点,
变量childs,是android系统提供的list集合类型的变量,用来保存当前节点的子节点,
变量isexpand,是android系统提供的boolean类型的变量,用来标记当前节点的展开状态,
变量data,是泛型变量,用来扩展数据的节点不同的数据类型结构。
在上述技术方案的基础上,步骤2中,所述适配器抽象类basetreeadapter具体包括:
变量mrootdata,是android系统提供的list集合类型的变量,用来保存最外层根节点,
变量mvisibledata,是android系统提供的list集合类型的变量,用来保存展开可见的节点。
在上述技术方案的基础上,步骤3中,为提升性能、避免过多的对象创建,定义适配器simpletreeadapter类中的内部类viewholder,用来存储xml文件生成实例化好的布局对象,具体包括:
变量micon,是android系统提供的imageview图片控件类型的变量,用来显示层级树形节点前展开和关闭时不同的状态,
变量mtext,是android系统提供的文字展示控件textview类型的变量,用来加载层级数据节点的字体内容。
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。