diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 613f93793..487451301 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -40,6 +40,7 @@
+
diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/node/ChooseNodeUseTypeActivity.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/node/ChooseNodeUseTypeActivity.java
index f6a3f5c1a..28e669a09 100644
--- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/node/ChooseNodeUseTypeActivity.java
+++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/node/ChooseNodeUseTypeActivity.java
@@ -29,5 +29,17 @@ public void onClick(View v) {
}
});
+ findViewById(R.id.card_view3).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ startActivity(new Intent(ChooseNodeUseTypeActivity.this, NotdeNTreeUserActivity.class));
+ }
+ });
+
+
+
+
+
+
}
}
diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/node/NotdeNTreeUserActivity.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/node/NotdeNTreeUserActivity.java
new file mode 100644
index 000000000..9ee3e8322
--- /dev/null
+++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/activity/node/NotdeNTreeUserActivity.java
@@ -0,0 +1,111 @@
+package com.chad.baserecyclerviewadapterhelper.activity.node;
+
+import android.os.Bundle;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.chad.baserecyclerviewadapterhelper.R;
+import com.chad.baserecyclerviewadapterhelper.adapter.node.tree.NodeNTreeAdapter;
+import com.chad.baserecyclerviewadapterhelper.adapter.node.tree.NodeTreeAdapter;
+import com.chad.baserecyclerviewadapterhelper.base.BaseActivity;
+import com.chad.baserecyclerviewadapterhelper.entity.node.tree.FirstNode;
+import com.chad.baserecyclerviewadapterhelper.entity.node.tree.SecondNode;
+import com.chad.baserecyclerviewadapterhelper.entity.node.tree.ThirdNode;
+import com.chad.baserecyclerviewadapterhelper.utils.Tips;
+import com.chad.library.adapter.base.entity.node.BaseNode;
+import com.chad.library.adapter.base.listener.GridSpanSizeLookup;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author : lipengbp
+ * @email : lipengbo@okay.cn
+ * @date : 2022/08/28 15:41
+ * @desc : 描述
+ */
+public class NotdeNTreeUserActivity extends BaseActivity {
+
+ private RecyclerView mRecyclerView;
+ private NodeNTreeAdapter adapter = new NodeNTreeAdapter();
+
+ private List data=new ArrayList<>();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_node_n_tree);
+ setBackBtn();
+ setTitle("Node Use (Tree)");
+
+ mRecyclerView = findViewById(R.id.rv_list);
+ mRecyclerView.setLayoutManager(new GridLayoutManager(this,2));
+ data=getEntity();
+ mRecyclerView.setAdapter(adapter);
+ adapter.setList(data);
+
+ // 模拟新增node
+ mRecyclerView.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ SecondNode seNode = new SecondNode(new ArrayList(), "Second Node(This is added)");
+ List thirdNodeList1 = new ArrayList<>();
+ for (int i = 0; i < 8; i++) {
+ ThirdNode node = new ThirdNode("Third Node (This is added)" + i);
+ thirdNodeList1.add(node);
+ }
+ seNode.getChildNode().addAll(thirdNodeList1);
+ SecondNode seNode2 = new SecondNode(new ArrayList(), "Second Node(This is added)");
+ List thirdNodeList2 = new ArrayList<>();
+ for (int i = 0; i < 8; i++) {
+ ThirdNode node = new ThirdNode("Third Node (This is added)" + i);
+ thirdNodeList2.add(node);
+ }
+ seNode2.getChildNode().addAll(thirdNodeList2);
+ List nodes = new ArrayList<>();
+ nodes.add(seNode);
+ nodes.add(seNode2);
+ //第一个夫node,位置为子node的3号位置
+ adapter.nodeAddData(adapter.getData().get(0), 2, nodes);
+// adapter.nodeSetData(adapter.getData().get(0), 2, seNode2);
+// adapter.nodeReplaceChildData(adapter.getData().get(0), nodes);
+ Tips.show("新插入了两个node", Toast.LENGTH_LONG);
+// adapter.nodeRemoveData(adapter.getData().get(0), 0);
+// Tips.show("删除一个Node节点", Toast.LENGTH_LONG);
+ }
+ }, 2000);
+ }
+
+ private List getEntity() {
+ List list = new ArrayList<>();
+ for (int i = 0; i < 8; i++) {
+
+ List secondNodeList = new ArrayList<>();
+ for (int n = 0; n <= 5; n++) {
+
+ List thirdNodeList = new ArrayList<>();
+ for (int t = 0; t <= 10; t++) {
+ ThirdNode node = new ThirdNode("Third Node " + t);
+ thirdNodeList.add(node);
+ }
+
+ SecondNode seNode = new SecondNode(thirdNodeList, "Second Node " + n);
+ secondNodeList.add(seNode);
+ }
+
+ FirstNode entity = new FirstNode(secondNodeList, "First Node " + i);
+
+ // 模拟 默认第0个是展开的
+ entity.setExpanded(i == 0);
+
+ list.add(entity);
+ }
+ return list;
+ }
+
+
+}
diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/node/tree/NodeNTreeAdapter.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/node/tree/NodeNTreeAdapter.java
new file mode 100644
index 000000000..f85be9bed
--- /dev/null
+++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/node/tree/NodeNTreeAdapter.java
@@ -0,0 +1,45 @@
+package com.chad.baserecyclerviewadapterhelper.adapter.node.tree;
+
+import com.chad.baserecyclerviewadapterhelper.adapter.node.tree.provider.FirstProvider;
+import com.chad.baserecyclerviewadapterhelper.adapter.node.tree.provider.SecondProvider;
+import com.chad.baserecyclerviewadapterhelper.adapter.node.tree.provider.ThirdProvider;
+import com.chad.baserecyclerviewadapterhelper.entity.node.tree.FirstNode;
+import com.chad.baserecyclerviewadapterhelper.entity.node.tree.SecondNode;
+import com.chad.baserecyclerviewadapterhelper.entity.node.tree.ThirdNode;
+import com.chad.library.adapter.base.BaseNodeAdapter;
+import com.chad.library.adapter.base.entity.node.BaseNode;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+
+/**
+ * @author : lipengbp
+ * @email : lipengbo@okay.cn
+ * @date : 2022/08/28 15:43
+ * @desc : 描述
+ */
+public class NodeNTreeAdapter extends BaseNodeAdapter {
+
+ public NodeNTreeAdapter() {
+ super();
+ addFullSpanNodeProvider(new FirstProvider());
+ addFullSpanNodeProvider(new SecondProvider());
+ addNodeProvider(new ThirdProvider());
+ }
+
+ @Override
+ protected int getItemType(@NotNull List extends BaseNode> data, int position) {
+ BaseNode node = data.get(position);
+ if (node instanceof FirstNode) {
+ return 1;
+ } else if (node instanceof SecondNode) {
+ return 2;
+ } else if (node instanceof ThirdNode) {
+ return 3;
+ }
+ return -1;
+ }
+
+ public static final int EXPAND_COLLAPSE_PAYLOAD = 110;
+}
diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/node/tree/provider/SecondProvider.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/node/tree/provider/SecondProvider.java
index cf579457a..78894db99 100644
--- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/node/tree/provider/SecondProvider.java
+++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/adapter/node/tree/provider/SecondProvider.java
@@ -40,7 +40,8 @@ public void onClick(@NotNull BaseViewHolder helper, @NotNull View view, BaseNode
if (entity.isExpanded()) {
getAdapter().collapse(position);
} else {
- getAdapter().expandAndCollapseOther(position);
+ getAdapter().expand(position);
+// getAdapter().expandAndCollapseOther(position);
}
}
}
diff --git a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/entity/node/tree/ThirdNode.java b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/entity/node/tree/ThirdNode.java
index 469a8c2ee..5c4591ca5 100644
--- a/app/src/main/java/com/chad/baserecyclerviewadapterhelper/entity/node/tree/ThirdNode.java
+++ b/app/src/main/java/com/chad/baserecyclerviewadapterhelper/entity/node/tree/ThirdNode.java
@@ -1,18 +1,24 @@
package com.chad.baserecyclerviewadapterhelper.entity.node.tree;
+import com.chad.library.adapter.base.entity.node.BaseExpandNode;
import com.chad.library.adapter.base.entity.node.BaseNode;
import org.jetbrains.annotations.Nullable;
import java.util.List;
-public class ThirdNode extends BaseNode {
+public class ThirdNode extends BaseExpandNode {
private String title;
+
public ThirdNode(String title) {
this.title = title;
}
+
+
+
+
public String getTitle() {
return title;
}
diff --git a/app/src/main/res/layout/activity_choose_node_use_type.xml b/app/src/main/res/layout/activity_choose_node_use_type.xml
index 048695c5c..6e0d02cfd 100644
--- a/app/src/main/res/layout/activity_choose_node_use_type.xml
+++ b/app/src/main/res/layout/activity_choose_node_use_type.xml
@@ -80,5 +80,42 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_node_n_tree.xml b/app/src/main/res/layout/activity_node_n_tree.xml
new file mode 100644
index 000000000..f125da880
--- /dev/null
+++ b/app/src/main/res/layout/activity_node_n_tree.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseNodeAdapter.kt b/library/src/main/java/com/chad/library/adapter/base/BaseNodeAdapter.kt
index 804d9f034..e5516e6c9 100644
--- a/library/src/main/java/com/chad/library/adapter/base/BaseNodeAdapter.kt
+++ b/library/src/main/java/com/chad/library/adapter/base/BaseNodeAdapter.kt
@@ -8,8 +8,8 @@ import com.chad.library.adapter.base.entity.node.NodeFooterImp
import com.chad.library.adapter.base.provider.BaseItemProvider
import com.chad.library.adapter.base.provider.BaseNodeProvider
-abstract class BaseNodeAdapter(nodeList: MutableList? = null)
- : BaseProviderMultiAdapter(null) {
+abstract class BaseNodeAdapter(nodeList: MutableList? = null) :
+ BaseProviderMultiAdapter(null) {
private val fullSpanNodeTypeSet = HashSet()
@@ -258,7 +258,9 @@ abstract class BaseNodeAdapter(nodeList: MutableList? = null)
return
}
val parentIndex = this.data.indexOf(parentNode)
+// val expandEndLeafNode= findExpandEndLeafChildNode(parentNode,childIndex-1)
val pos = parentIndex + 1 + childIndex
+// val pos= this.data.indexOf(expandEndLeafNode)+1
addData(pos, newData)
}
}
@@ -370,7 +372,10 @@ abstract class BaseNodeAdapter(nodeList: MutableList? = null)
* @param isExpanded Boolean? 如果不需要改变状态,设置为null。true 为展开,false 为收起
* @return MutableList
*/
- private fun flatData(list: Collection, isExpanded: Boolean? = null): MutableList {
+ private fun flatData(
+ list: Collection,
+ isExpanded: Boolean? = null
+ ): MutableList {
val newList = ArrayList()
for (element in list) {
@@ -415,11 +420,13 @@ abstract class BaseNodeAdapter(nodeList: MutableList? = null)
* @param animate Boolean
* @param notify Boolean
*/
- private fun collapse(@IntRange(from = 0) position: Int,
- isChangeChildCollapse: Boolean = false,
- animate: Boolean = true,
- notify: Boolean = true,
- parentPayload: Any? = null): Int {
+ private fun collapse(
+ @IntRange(from = 0) position: Int,
+ isChangeChildCollapse: Boolean = false,
+ animate: Boolean = true,
+ notify: Boolean = true,
+ parentPayload: Any? = null
+ ): Int {
val node = this.data[position]
if (node is BaseExpandNode && node.isExpanded) {
@@ -455,11 +462,13 @@ abstract class BaseNodeAdapter(nodeList: MutableList? = null)
* @param animate Boolean
* @param notify Boolean
*/
- private fun expand(@IntRange(from = 0) position: Int,
- isChangeChildExpand: Boolean = false,
- animate: Boolean = true,
- notify: Boolean = true,
- parentPayload: Any? = null): Int {
+ private fun expand(
+ @IntRange(from = 0) position: Int,
+ isChangeChildExpand: Boolean = false,
+ animate: Boolean = true,
+ notify: Boolean = true,
+ parentPayload: Any? = null
+ ): Int {
val node = this.data[position]
if (node is BaseExpandNode && !node.isExpanded) {
@@ -493,10 +502,12 @@ abstract class BaseNodeAdapter(nodeList: MutableList? = null)
* @param notify Boolean
*/
@JvmOverloads
- fun collapse(@IntRange(from = 0) position: Int,
- animate: Boolean = true,
- notify: Boolean = true,
- parentPayload: Any? = null): Int {
+ fun collapse(
+ @IntRange(from = 0) position: Int,
+ animate: Boolean = true,
+ notify: Boolean = true,
+ parentPayload: Any? = null
+ ): Int {
return collapse(position, false, animate, notify, parentPayload)
}
@@ -507,10 +518,12 @@ abstract class BaseNodeAdapter(nodeList: MutableList? = null)
* @param notify Boolean
*/
@JvmOverloads
- fun expand(@IntRange(from = 0) position: Int,
- animate: Boolean = true,
- notify: Boolean = true,
- parentPayload: Any? = null): Int {
+ fun expand(
+ @IntRange(from = 0) position: Int,
+ animate: Boolean = true,
+ notify: Boolean = true,
+ parentPayload: Any? = null
+ ): Int {
return expand(position, false, animate, notify, parentPayload)
}
@@ -521,10 +534,12 @@ abstract class BaseNodeAdapter(nodeList: MutableList? = null)
* @param notify Boolean
*/
@JvmOverloads
- fun expandOrCollapse(@IntRange(from = 0) position: Int,
- animate: Boolean = true,
- notify: Boolean = true,
- parentPayload: Any? = null): Int {
+ fun expandOrCollapse(
+ @IntRange(from = 0) position: Int,
+ animate: Boolean = true,
+ notify: Boolean = true,
+ parentPayload: Any? = null
+ ): Int {
val node = this.data[position]
if (node is BaseExpandNode) {
return if (node.isExpanded) {
@@ -537,18 +552,22 @@ abstract class BaseNodeAdapter(nodeList: MutableList? = null)
}
@JvmOverloads
- fun expandAndChild(@IntRange(from = 0) position: Int,
- animate: Boolean = true,
- notify: Boolean = true,
- parentPayload: Any? = null): Int {
+ fun expandAndChild(
+ @IntRange(from = 0) position: Int,
+ animate: Boolean = true,
+ notify: Boolean = true,
+ parentPayload: Any? = null
+ ): Int {
return expand(position, true, animate, notify, parentPayload)
}
@JvmOverloads
- fun collapseAndChild(@IntRange(from = 0) position: Int,
- animate: Boolean = true,
- notify: Boolean = true,
- parentPayload: Any? = null): Int {
+ fun collapseAndChild(
+ @IntRange(from = 0) position: Int,
+ animate: Boolean = true,
+ notify: Boolean = true,
+ parentPayload: Any? = null
+ ): Int {
return collapse(position, true, animate, notify, parentPayload)
}
@@ -561,13 +580,15 @@ abstract class BaseNodeAdapter(nodeList: MutableList? = null)
* @param notify Boolean
*/
@JvmOverloads
- fun expandAndCollapseOther(@IntRange(from = 0) position: Int,
- isExpandedChild: Boolean = false,
- isCollapseChild: Boolean = true,
- animate: Boolean = true,
- notify: Boolean = true,
- expandPayload: Any? = null,
- collapsePayload: Any? = null) {
+ fun expandAndCollapseOther(
+ @IntRange(from = 0) position: Int,
+ isExpandedChild: Boolean = false,
+ isCollapseChild: Boolean = true,
+ animate: Boolean = true,
+ notify: Boolean = true,
+ expandPayload: Any? = null,
+ collapsePayload: Any? = null
+ ) {
val expandCount = expand(position, isExpandedChild, animate, notify, expandPayload)
if (expandCount == 0) {
@@ -654,4 +675,33 @@ abstract class BaseNodeAdapter(nodeList: MutableList? = null)
}
return -1
}
+
+
+ /**
+ * 获取展开状态的叶子节点
+ */
+ private fun findExpandEndLeafChildNode(node: BaseNode, childIndex: Int):BaseNode?{
+ if(node.childNode==null){
+ return null
+ }
+ if(childIndex> node.childNode!!.size){
+ return null
+ }
+ return findExpandEndLeafChildNode(node.childNode!![childIndex])
+ }
+
+ /**
+ * 获取展开状态的叶子节点
+ */
+ private fun findExpandEndLeafChildNode(node: BaseNode): BaseNode {
+ if (node.childNode == null) {
+ return node
+ }
+ if (node is BaseExpandNode && node.isExpanded) {
+ return findExpandEndLeafChildNode(node.childNode!![node.childNode!!.size - 1])
+ }
+ return node
+ }
+
+
}
\ No newline at end of file