From 453767de43d530c32b282f6139689cfdd2b8b520 Mon Sep 17 00:00:00 2001 From: limuyang Date: Fri, 3 Jan 2020 16:00:26 +0800 Subject: [PATCH] fix node data settings bug --- .../library/adapter/base/BaseNodeAdapter.kt | 93 ++++++++++++++++--- 1 file changed, 80 insertions(+), 13 deletions(-) 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 4b92664e4..0609eeac1 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 @@ -134,6 +134,10 @@ abstract class BaseNodeAdapter(data: MutableList? = null) notifyItemRangeChanged(index + getHeaderLayoutCount(), max(removeCount, newFlatData.size)) } + /** + * 替换整个列表数据,如果需要对某节点下的子节点进行替换,请使用[nodeReplaceChildData]! + * @param newData Collection + */ override fun replaceData(newData: Collection) { // 不是同一个引用才清空列表 if (newData != this.data) { @@ -196,6 +200,31 @@ abstract class BaseNodeAdapter(data: MutableList? = null) return removeCount } + private fun removeChildAt(position: Int): Int { + if (position >= data.size) { + return 0 + } + // 记录被移除的item数量 + var removeCount = 0 + + val node = this.data[position] + // 先移除子项 + if (!node.childNode.isNullOrEmpty()) { + if (node is BaseExpandNode) { + if (node.isExpanded) { + val items = flatData(node.childNode!!) + this.data.removeAll(items) + removeCount = items.size + } + } else { + val items = flatData(node.childNode!!) + this.data.removeAll(items) + removeCount = items.size + } + } + return removeCount + } + /*************************** 重写数据设置方法 END ***************************/ @@ -221,7 +250,7 @@ abstract class BaseNodeAdapter(data: MutableList? = null) } /** - * 对指定的父node,在指定位置添加添加子node + * 对指定的父node,在指定位置添加子node * @param parentNode BaseNode 父node * @param childIndex Int 此位置是相对于其childNodes数据的位置!并不是整个data * @param data BaseNode 添加的数据 @@ -236,10 +265,16 @@ abstract class BaseNodeAdapter(data: MutableList? = null) val parentIndex = this.data.indexOf(parentNode) val pos = parentIndex + 1 + childIndex - addData(parentIndex + pos, data) + addData(pos, data) } } + /** + * 对指定的父node,在指定位置添加子node集合 + * @param parentNode BaseNode 父node + * @param childIndex Int 此位置是相对于其childNodes数据的位置!并不是整个data + * @param newData 添加的数据集合 + */ fun nodeAddData(parentNode: BaseNode, childIndex: Int, newData: Collection) { parentNode.childNode?.let { it.addAll(childIndex, newData) @@ -249,7 +284,7 @@ abstract class BaseNodeAdapter(data: MutableList? = null) } val parentIndex = this.data.indexOf(parentNode) val pos = parentIndex + 1 + childIndex - addData(parentIndex + pos, newData) + addData(pos, newData) } } @@ -264,15 +299,16 @@ abstract class BaseNodeAdapter(data: MutableList? = null) return } - it.removeAt(childIndex) - if (parentNode is BaseExpandNode && !parentNode.isExpanded) { + it.removeAt(childIndex) return } val parentIndex = this.data.indexOf(parentNode) val pos = parentIndex + 1 + childIndex - remove(parentIndex + pos) + remove(pos) + + it.removeAt(childIndex) } } @@ -283,16 +319,13 @@ abstract class BaseNodeAdapter(data: MutableList? = null) */ fun nodeRemoveData(parentNode: BaseNode, childNode: BaseNode) { parentNode.childNode?.let { - val isOk = it.remove(childNode) - - if (!isOk) { - return - } - if (parentNode is BaseExpandNode && !parentNode.isExpanded) { + it.remove(childNode) return } remove(childNode) + + it.remove(childNode) } } @@ -307,11 +340,45 @@ abstract class BaseNodeAdapter(data: MutableList? = null) if (childIndex >= it.size) { return } - it[childIndex] = data + + if (parentNode is BaseExpandNode && !parentNode.isExpanded) { + it[childIndex] = data + return + } val parentIndex = this.data.indexOf(parentNode) val pos = parentIndex + 1 + childIndex setData(pos, data) + + it[childIndex] = data + } + } + + /** + * 替换父节点下的子节点集合 + * @param parentNode BaseNode + * @param newData Collection + */ + fun nodeReplaceChildData(parentNode: BaseNode, newData: Collection) { + parentNode.childNode?.let { + if (parentNode is BaseExpandNode && !parentNode.isExpanded) { + it.clear() + it.addAll(newData) + return + } + + val parentIndex = this.data.indexOf(parentNode) + val removeCount = removeChildAt(parentIndex) + notifyItemRangeRemoved(parentIndex + 1 + getHeaderLayoutCount(), removeCount) + + it.clear() + it.addAll(newData) + + val newFlatData = flatData(newData) + this.data.addAll(parentIndex + 1, newFlatData) + + notifyItemRangeInserted(parentIndex + 1 + getHeaderLayoutCount(), newFlatData.size) +// notifyItemRangeChanged(parentIndex + 1 + getHeaderLayoutCount(), max(removeCount, newFlatData.size)) } }