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 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