公司有一个需求,实现一个多级的树形菜单,并且支持多选功能,实现这个功能之前,我在网上找了找,树形菜单很好找,但是支持多选功能并没有很合适的,所以没办法,只能自己动手写了,由于本人第一次写博客,如果有什么不足的地方,大家多多指教。
这个是效果图:
这个菜单是可以无限极分类的,如果父元素的子元素,都被选了,父元素的复选框应该自动选中,或者说选中一个父元素,当前父元素下的子元素应该全部被选中。就是这样的一个效果!
这样的树形结构,重点是我们应该怎样去定义数据结构,这个是节点实体类:
公共类节点实现Serializable { 私人节点父母=零;//父节点 私人List儿童=new ArrayList ();//子节点 私人字符串标题;//节点显示文字 私人字符串值;//节点显示值 私人布尔完成=false;//是否被选中 私人布尔isExpand=true;//是否处于扩展状态 私人布尔hasCheckBox=true;//是否有复选框 私人字符串parentId=零; 私人字符串curId=零; 私人布尔isVisiable=true;//自己加的,父节点集合 私人List 父母=new ArrayList<在();/* * *设置节点值 * * @param parentId *待办事项 * @param curId *待办事项 */公共节点(parentId字符串标题、字符串值字符串,字符串curId) {//TODO自动生成构造函数存根 这一点。标题=标题; 这一点。值=https://www.yisu.com/zixun/value; 这一点。parentId=parentId;//这个。图标=iconId; 这一点。curId=curId; } 公共列表<节点> getParents () { 回报父母; }/* * *得到父节点 * @return * */公共节点getParent () { 回报父母; }/* * *设置父节点 * @param父 * */公共空间setParent(父节点){ 这一点。父母=父母; }/* * *得到子节点 * @return * */公共列表<节点>调用getchildren () { 返回儿童; }/* * *是否根节点 * @return * */公共布尔isRoot () { 返回父==null ?真:假; }/* * *是否被选中 * @return * */公共布尔完成(){ 返回完成; } 公共空间setChecked(布尔完成){ 这一点。完成=完成; }/* * *是否是展开状态 * @return * */公共布尔isExplaned () { 返回isExpand; }/* * *设置展开状态 * @param isExplaned * */公共空间setExplaned(布尔isExplaned) { 这一点。isExpand=isExplaned; }/* * *是否有复选框 * @return * */公共布尔hasCheckBox () { 返回hasCheckBox; }/* * *设置是否有复选框 * @param hasCheckBox * */公共空间setHasCheckBox(布尔hasCheckBox) { 这一点。hasCheckBox=hasCheckBox; }/* * *得到节点标题 * @return * */公共字符串getTitle () { 返回标题; }/* * *设置节点标题 * @param标题 * */公共空间setTitle(字符串标题){ 这一点。标题=标题; }/* * *得到节点值 * @return * */公共字符串getValue () { 返回值; }/* * *设置节点值 * @param价值 * */公共空间setValue(字符串值){ 这一点。值=价值; }/* * *增加一个子节点 * @param节点 * */公共空间addNode(节点节点){ 如果(! childrens.contains(节点)){ childrens.add(节点); } }/* * *移除一个子节点 * @param节点 * */公共空间removeNode(节点节点){ 如果(childrens.contains(节点)) childrens.remove(节点); }/* * *移除指定位置的子节点 * @param位置 * */公共空间removeNode (int位置){ childrens.remove(位置); }/* * *清除所有子节点 * */公共空间清理(){ childrens.clear (); }/* * *判断给出的节点是否当前节点的父节点 * @param节点 * @return * */公共布尔isParent(节点){ 如果(父==null)返回false; 如果(parent.equals(节点))返回true; 返回parent.isParent(节点); }/* * *递归获取当前节点级别 * @return * */公共int getLevel () { 返回父==null ? 0: parent.getLevel () + 1; }/* * *父节点是否处于折叠的状态 * @return * */公共布尔isParentCollapsed () { 如果(父==null)返回false; 如果(! parent.isExplaned()返回true; 返回parent.isParentCollapsed (); }/* * *是否叶节点(没有展开下级的几点) * @return * */公共布尔isLeaf () { 返回childrens.size() Android实现多级树形菜单并支持多选功能