BaseRecyclerViewAdapterHelper icon indicating copy to clipboard operation
BaseRecyclerViewAdapterHelper copied to clipboard

nodeRemoveData接口删除最后一个节点的时候会挂掉

Open hjjyyc opened this issue 4 years ago • 5 comments

我使用NodeTreeAdapter做了3级树形试图,在使用nodeRemoveData接口删除SecondNode节点时,删除最后一个SecondNode节点总会导致程序挂掉,删除别的SecondNode节点不会,报错的内容总是IndexOutOfBoundsException,希望能修复这个bug,万分感谢!

hjjyyc avatar Jun 02 '21 10:06 hjjyyc

+1

1226362423 avatar Jun 08 '21 07:06 1226362423

+1,最简单的解决办法是try catch.在catch中notifyItemRangeRemoved(position, 1); 问题原因是删除节点时会同时做这些动作:

  1. 移除子项
  2. 移除node自己
  3. 移除脚部

前2步没问题,第3步时:data.size()就与删除的position相等了,所以报下标越界。 具体代码:

BaseNodeAdapter.kt
   /**
     * 从数组中移除
     * @param position Int
     * @return Int 被移除的数量
     */
    private fun removeNodesAt(position: Int): Int {
        if (position >= data.size) {
            return 0
        }
        // 记录被移除的item数量
        var removeCount = 0

        // 先移除子项
        removeCount = removeChildAt(position)

        // 移除node自己
        this.data.removeAt(position)
        removeCount += 1

        val node = this.data[position]     <-------- 此处出现下标越界
        // 移除脚部
        if (node is NodeFooterImp && node.footerNode != null) {
            this.data.removeAt(position)
            removeCount += 1
        }
        return removeCount
    }

yilichenai000000 avatar Jul 01 '21 09:07 yilichenai000000

+1,最简单的解决办法是try catch.在catch中notifyItemRangeRemoved(position, 1); 问题原因是删除节点时会同时做这些动作:

  1. 移除子项
  2. 移除node自己
  3. 移除脚部

前2步没问题,第3步时:data.size()就与删除的position相等了,所以报下标越界。 具体代码:

BaseNodeAdapter.kt
   /**
     * 从数组中移除
     * @param position Int
     * @return Int 被移除的数量
     */
    private fun removeNodesAt(position: Int): Int {
        if (position >= data.size) {
            return 0
        }
        // 记录被移除的item数量
        var removeCount = 0

        // 先移除子项
        removeCount = removeChildAt(position)

        // 移除node自己
        this.data.removeAt(position)
        removeCount += 1

        val node = this.data[position]     <-------- 此处出现下标越界
        // 移除脚部
        if (node is NodeFooterImp && node.footerNode != null) {
            this.data.removeAt(position)
            removeCount += 1
        }
        return removeCount
    }

感谢兄弟

taojr95 avatar Jul 02 '21 05:07 taojr95

请问删除子节点nodeRemoveData()如何传值 如何获取父node 与子节点相对位置

benben1 avatar Jun 06 '22 09:06 benben1

BaseNode parentNode = getAdapter().getItem(getAdapter().findParentNode(position)); int childIndex = parentNode.getChildNode().indexOf(data);

taojr95 avatar Jun 06 '22 10:06 taojr95