@@ -412,7 +412,7 @@ public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel)
412412 mTreeModel .addNode (targetHolderNode ,releasedChildHolderNode );
413413 mTreeModel .calculateTreeNodesDeep ();
414414 if (isAnimateMove ()){
415- recordAnchorLocationOnViewPort (false ,targetHolderNode );
415+ recordAnchorLocationOnViewPort (false ,false , targetHolderNode );
416416 }
417417 requestLayout ();
418418 }else {
@@ -561,7 +561,7 @@ public void onDataSetChange(){
561561 public void onAddNodes (NodeModel <?> parent , NodeModel <?>... childNodes ) {
562562 if (adapter !=null ){
563563 if (isAnimateAdd ()){
564- recordAnchorLocationOnViewPort (false , parent );
564+ recordAnchorLocationOnViewPort (false , false , parent );
565565 }
566566 mTreeModel .addNode (parent ,childNodes );
567567 mTreeModel .calculateTreeNodesDeep ();
@@ -572,52 +572,73 @@ public void onAddNodes(NodeModel<?> parent, NodeModel<?>... childNodes) {
572572 }
573573
574574 @ Override
575- public void onRemoveNodes (NodeModel <?>... nodeModels ) {
575+ public void onRemoveNode (NodeModel <?> nodeModel ) {
576+ innerRemoveNode (nodeModel , false );
577+ }
578+
579+ @ Override
580+ public void onRemoveChildNodes (NodeModel <?> parentNode ) {
581+ innerRemoveNode (parentNode ,true );
582+ }
583+
584+ private void innerRemoveNode (NodeModel <?> nodeModel , boolean isRemoveChildNodesOnly ){
576585 if (adapter !=null ){
577586 if (isAnimateRemove ()){
578- recordAnchorLocationOnViewPort (true , nodeModels );
579- }
580- for (NodeModel <?> nodeToRemove : nodeModels ) {
581- adapter .getTreeModel ().removeNode (nodeToRemove .getParentNode (), nodeToRemove );
582- }
583- mTreeModel .calculateTreeNodesDeep ();
584- if (isAnimateRemove ()){
585- requestLayout ();
587+ recordAnchorLocationOnViewPort (true ,isRemoveChildNodesOnly ,nodeModel );
588+ if (isRemoveChildNodesOnly ){
589+ nodeModel .traverseDirectChildren (next ->adapter .getTreeModel ().removeNode (nodeModel , next ));
590+ }else {
591+ adapter .getTreeModel ().removeNode (nodeModel .getParentNode (), nodeModel );
592+ }
586593 }else {
587- for (NodeModel <?> nodeToRemove : nodeModels ) {
588- nodeToRemove .selfTraverse (next -> {
589- //remove view
590- TreeViewHolder <?> holder = getTreeViewHolder (next );
591- if (holder != null ){
592- removeView (holder .getView ());
593- recycleHolder (holder );
594- }
595- });
594+ if (isRemoveChildNodesOnly ){
595+ nodeModel .traverseExcludeSelf (this ::removeViewByNode );
596+ nodeModel .traverseDirectChildren (next ->adapter .getTreeModel ().removeNode (nodeModel , next ));
597+ }else {
598+ nodeModel .traverseIncludeSelf (this ::removeViewByNode );
599+ adapter .getTreeModel ().removeNode (nodeModel .getParentNode (), nodeModel );
596600 }
597601 }
602+ mTreeModel .calculateTreeNodesDeep ();
603+ requestLayout ();
604+ }
605+ }
606+
607+ /**
608+ * Remove View By Node
609+ * @param nodeModel node to remove the view
610+ */
611+ private void removeViewByNode (NodeModel <?> nodeModel ){
612+ //remove view
613+ TreeViewHolder <?> holder = getTreeViewHolder (nodeModel );
614+ if (holder != null ){
615+ removeView (holder .getView ());
616+ recycleHolder (holder );
598617 }
599618 }
600619
601620 /**
602621 * Prepare moving, adding or removing nodes, record the last one node as an anchor node on view port, so that make it looks smooth change
603- * Note:
604- * The last one will been choose as target node.
605- *
606- * @param nodeModels nodes[nodes.length-1] as the target one
622+ * @param targetNode the target one
607623 */
608- private void recordAnchorLocationOnViewPort (boolean isRemove , NodeModel <?>... nodeModels ) {
609- if (nodeModels ==null || nodeModels . length == 0 ){
624+ private void recordAnchorLocationOnViewPort (boolean isRemove , boolean isRemoveChildrenOnly , NodeModel <?> targetNode ) {
625+ if (targetNode ==null ){
610626 return ;
611627 }
612- NodeModel <?> targetNode = nodeModels [nodeModels .length -1 ];
613- if (targetNode !=null && isRemove ){
628+ if (isRemove ){
614629 //if remove, parent will be the target node
615630 Map <NodeModel <?>,View > removeNodeMap = new HashMap <>();
616- targetNode .selfTraverse (node -> {
617- removeNodeMap .put (node ,getTreeViewHolder (node ).getView ());
618- });
631+ if (isRemoveChildrenOnly ){
632+ targetNode .traverseExcludeSelf (node -> {
633+ removeNodeMap .put (node ,getTreeViewHolder (node ).getView ());
634+ });
635+ }else {
636+ targetNode .traverseIncludeSelf (node -> {
637+ removeNodeMap .put (node ,getTreeViewHolder (node ).getView ());
638+ });
639+ targetNode = targetNode .getParentNode ();
640+ }
619641 setTag (R .id .mark_remove_views ,removeNodeMap );
620- targetNode = targetNode .getParentNode ();
621642 }
622643 if (targetNode !=null ){
623644 TreeViewHolder <?> targetHolder = getTreeViewHolder (targetNode );
0 commit comments