Skip to content

Commit a4b4dd6

Browse files
committed
just delete children nodes
1 parent 22978d6 commit a4b4dd6

4 files changed

Lines changed: 43 additions & 32 deletions

File tree

library/src/main/java/com/gyso/treeview/GysoTreeView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public GysoTreeView(@NonNull Context context, @Nullable AttributeSet attrs, int
5151

5252
//set animate default
5353
treeViewContainer.setAnimateAdd(true);
54-
treeViewContainer.setAnimateRemove(false);
54+
treeViewContainer.setAnimateRemove(true);
5555
treeViewContainer.setAnimateMove(true);
5656
}
5757

library/src/main/java/com/gyso/treeview/TreeViewContainer.java

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -585,23 +585,22 @@ private void innerRemoveNode(NodeModel<?> nodeModel, boolean isRemoveChildNodesO
585585
if(adapter!=null){
586586
if(isAnimateRemove()){
587587
recordAnchorLocationOnViewPort(true,isRemoveChildNodesOnly ,nodeModel);
588-
}
589-
if(isRemoveChildNodesOnly){
590-
nodeModel.traverseChildren(next->adapter.getTreeModel().removeNode(nodeModel, next));
591-
}else{
592-
adapter.getTreeModel().removeNode(nodeModel.getParentNode(), nodeModel);
593-
}
594-
595-
mTreeModel.calculateTreeNodesDeep();
596-
if(isAnimateRemove()){
597-
requestLayout();
588+
if(isRemoveChildNodesOnly){
589+
nodeModel.traverseDirectChildren(next->adapter.getTreeModel().removeNode(nodeModel, next));
590+
}else{
591+
adapter.getTreeModel().removeNode(nodeModel.getParentNode(), nodeModel);
592+
}
598593
}else{
599594
if(isRemoveChildNodesOnly){
600-
nodeModel.traverseChildren(this::removeViewByNode);
595+
nodeModel.traverseExcludeSelf(this::removeViewByNode);
596+
nodeModel.traverseDirectChildren(next->adapter.getTreeModel().removeNode(nodeModel, next));
601597
}else{
602-
nodeModel.selfTraverse(this::removeViewByNode);
598+
nodeModel.traverseIncludeSelf(this::removeViewByNode);
599+
adapter.getTreeModel().removeNode(nodeModel.getParentNode(), nodeModel);
603600
}
604601
}
602+
mTreeModel.calculateTreeNodesDeep();
603+
requestLayout();
605604
}
606605
}
607606

@@ -630,11 +629,11 @@ private void recordAnchorLocationOnViewPort(boolean isRemove, boolean isRemoveCh
630629
//if remove, parent will be the target node
631630
Map<NodeModel<?>,View> removeNodeMap = new HashMap<>();
632631
if(isRemoveChildrenOnly){
633-
targetNode.traverseChildren(node -> {
632+
targetNode.traverseExcludeSelf(node -> {
634633
removeNodeMap.put(node,getTreeViewHolder(node).getView());
635634
});
636635
}else{
637-
targetNode.selfTraverse(node -> {
636+
targetNode.traverseIncludeSelf(node -> {
638637
removeNodeMap.put(node,getTreeViewHolder(node).getView());
639638
});
640639
targetNode = targetNode.getParentNode();

library/src/main/java/com/gyso/treeview/model/NodeModel.java

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import androidx.annotation.Nullable;
55

66
import java.io.Serializable;
7+
import java.util.Iterator;
78
import java.util.LinkedList;
89
import java.util.List;
910
import java.util.Stack;
@@ -129,47 +130,58 @@ private boolean addChildNode(NodeModel<T> aChild){
129130
* @param node to deal node
130131
*/
131132
private void traverse(NodeModel<T> node, INext<T> next){
133+
traverse(node,next,true);
134+
}
135+
136+
private void traverse(NodeModel<T> node, INext<T> next, boolean isIncludeSelf){
132137
if(node==null || next==null){
133138
return;
134139
}
135140
Stack<NodeModel<T>> stack = new Stack<>();
136141
stack.add(node);
137142
while (!stack.isEmpty()) {
138143
NodeModel<T> tmp = stack.pop();
139-
next.next(tmp);
144+
if(isIncludeSelf){
145+
next.next(tmp);
146+
}else if(tmp!=this){
147+
next.next(tmp);
148+
}
140149
LinkedList<NodeModel<T>> childNodes = tmp.getChildNodes();
141150
stack.addAll(childNodes);
142151
}
143152
}
153+
/**
154+
* traverse all sub node include self
155+
* @param next callback
156+
*/
157+
public void traverseIncludeSelf(INext<T> next){
158+
if(next==null){
159+
return;
160+
}
161+
traverse(this,next,true);
162+
}
144163

145164
/**
146-
* traverse bys self
165+
* traverse all sub node exclude self
147166
* @param next callback
148167
*/
149-
public void selfTraverse(INext<T> next){
168+
public void traverseExcludeSelf(INext<T> next){
150169
if(next==null){
151170
return;
152171
}
153-
traverse(this,next);
172+
traverse(this,next,false);
154173
}
155174

156175
/**
157-
* traverse bys self
176+
* traverse only direct children
158177
* @param next callback
159178
*/
160-
public void traverseChildren(INext<T> next){
179+
public void traverseDirectChildren(INext<T> next){
161180
if(next==null){
162181
return;
163182
}
164-
Stack<NodeModel<T>> stack = new Stack<>();
165-
stack.add(this);
166-
while (!stack.isEmpty()) {
167-
NodeModel<T> tmp = stack.pop();
168-
if(tmp!=this){
169-
next.next(tmp);
170-
}
171-
LinkedList<NodeModel<T>> childNodes = tmp.getChildNodes();
172-
stack.addAll(childNodes);
183+
for (NodeModel<T> childNode : new LinkedList<>(childNodes)) {
184+
next.next(childNode);
173185
}
174186
}
175187

local.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
# For customization when using a Version Control System, please read the
66
# header note.
77
#Mon Jun 07 23:21:30 CST 2021
8-
//sdk.dir=D\:\\AndroidTool\\Sdk
9-
sdk.dir=D\:\\programfiles\\sdk
8+
sdk.dir=D\:\\AndroidTool\\Sdk
9+
//sdk.dir=D\:\\programfiles\\sdk

0 commit comments

Comments
 (0)