【问题标题】:Array remove didn't work on click listener?数组删除对点击监听器不起作用?
【发布时间】:2021-02-28 19:06:59
【问题描述】:

我的应用上有一个添加弹出按钮。在 add 函数 中,我可以将项目添加到数组中,但是当我按下弹出按钮从数组中取出项目时,它不起作用。我不知道为什么会这样。

在我当前的代码下面:

这是我的添加按钮功能,效果很好。

        holder.customView.imageButton4.setOnClickListener {
            addedCount += 1
            holder.customView.adet_text.text = "x$addedCount"

            var urun = holder.customView.urun_text.text
            var fiyat = holder.customView.fiyat_text.text

            var addedData = SepeteGidenUrunlerModel(
                urunEklenen = urun.toString(),
                fiyatEklenen = fiyat.toString()
            )

            FirstDetailActivity.sepeteEklenenUrunler.add(addedData)
        }

这是我的删除按钮:

        holder.customView.imageButton5.setOnClickListener {

            if (addedCount > 0) {
                addedCount -= 1

            }

            holder.customView.adet_text.text = "x$addedCount"

            var urun = holder.customView.urun_text.text
            var fiyat = holder.customView.fiyat_text.text
       
            var cikarilan = SepeteGidenUrunlerModel(
                urunEklenen = urun.toString(),
                fiyatEklenen = fiyat.toString()
            )

            FirstDetailActivity.sepeteEklenenUrunler.remove(cikarilan)
        }

这里是我的数据模型:class SepeteGidenUrunlerModel(val fiyatEklenen: String = "", val urunEklenen: String = "")

为什么这不起作用?

【问题讨论】:

  • SepeteGidenUrunlerModel 设为一个数据类,以便为它生成适当的equals 函数,以便可以使用新创建的等效实例将其删除。
  • 它就像一个魅力。你能写下答案,我可以检查一下。

标签: android arrays kotlin


【解决方案1】:

当你在数组中执行 .remove 时,你是通过引用而不是值来执行的,你应该在执行 .remove() 时引用原始项目

当你这样做时,你正在创建一个类型为 SepeteGidenUrunlerModel 的新对象,它与列表中的对象不同

var cikarilan = SepeteGidenUrunlerModel(
            urunEklenen = urun.toString(),
            fiyatEklenen = fiyat.toString()
        )

您可以做的是首先通过引用获取元素,然后从列表中删除该对象。 (像这样的,它可能包含一些语法错误,因为我不做 Kotlin)

  var urun = holder.customView.urun_text.text
  var fiyat = holder.customView.fiyat_text.text
   
  var urun = holder.customView.urun_text.text
  var fiyat = holder.customView.fiyat_text.text
  
  var cikarilan = FirstDetailActivity.sepeteEklenenUrunler.find(it.fiyatEklenen == urun.toString() && it.urunEklenen == fiyat.toString())

  FirstDetailActivity.sepeteEklenenUrunler.remove(cikarilan)

【讨论】:

  • 我的数组类型也是 SepeteGidenUrunlerModel。就像 var sepeteEklenenUrunler = ArrayList<SepeteGidenUrunlerModel>() 一样。当我尝试使用 $ 符号删除对象时,它也不起作用。
  • @mehmett 用可能的解决方案编辑了答案
  • 问题已经回答,但我会记住你的答案。
【解决方案2】:

如果您的模型类没有定义正确的 equals 函数,则会通过引用相等性进行比较,这意味着您在此单击侦听器中创建的新实例将与列表中已有的任何内容都不匹配,所以什么都不能连同它一起删除。

将模型类SepeteGidenUrunlerModel 声明为data class,以便在后台自动为其生成equals 函数。

【讨论】:

  • 所以如果我从我的模型中删除 equals,它可以工作吗?我的模型有空的相等字符串,这是否等于你说要回答的?
  • “删除等于”是什么意思?
【解决方案3】:
        var cikarilan = SepeteGidenUrunlerModel(
            urunEklenen = urun.toString(),
            fiyatEklenen = fiyat.toString()
        )

        FirstDetailActivity.sepeteEklenenUrunler.remove(cikarilan)

您正在删除您在上面创建的项目,Java/Kotlin 试图找到 equals 方法告诉他们这是您的意思的项目,然后将其删除。

您尚未定义 equals 方法,因此它会尝试“通过引用”找到它,这意味着您永远无法找到刚刚创建的项目,因为它们始终位于内存中的不同位置。

要么重写 equals 方法以包含诸如 id 之类的内容,要么重写您的删除逻辑以删除最后一项(例如,您需要以某种方式找到您想要的项目,然后您可以将其删除)。

【讨论】:

  • 我明白,但是当我尝试编写 for 循环时:` for (i in sepeteEklenenUrunler){ if(i.urunEklenen == urun.toString()){ sepeteEklenenUrunler.remove(i) } } `。它也出现错误。真不知道怎么解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多