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

vyswwuz2  于 2023-02-04  发布在  其他
关注(0)|答案(5)|浏览(280)

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

xyhw6mcr

xyhw6mcr2#

+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
    }
uxh89sit

uxh89sit3#

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

感谢兄弟

krcsximq

krcsximq4#

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

hof1towb

hof1towb5#

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

相关问题