Android 数组删除';不能在click listener上工作?
我的应用程序上有一个添加和弹出按钮。在添加功能中我可以将项目添加到阵列中,但当我按下弹出按钮从阵列中取出项目时,它不起作用。我不明白为什么会这样 下面是我当前的代码: 这是我的添加按钮功能,运行良好Android 数组删除';不能在click listener上工作?,android,arrays,kotlin,Android,Arrays,Kotlin,我的应用程序上有一个添加和弹出按钮。在添加功能中我可以将项目添加到阵列中,但当我按下弹出按钮从阵列中取出项目时,它不起作用。我不明白为什么会这样 下面是我当前的代码: 这是我的添加按钮功能,运行良好 holder.customView.imageButton4.setOnClickListener { addedCount += 1 holder.customView.adet_text.text = "x$addedCo
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 separategidenurunermodel(val-fiyatEklenen:String=“”,val-urunEklenen:String=“”)
为什么这不起作用
var cikarilan = SepeteGidenUrunlerModel(
urunEklenen = urun.toString(),
fiyatEklenen = fiyat.toString()
)
FirstDetailActivity.sepeteEklenenUrunler.remove(cikarilan)
当您删除您在上面创建的项时,Java/Kotlin尝试查找equals方法告诉他们这就是您所指的项的项,然后将其删除
您尚未定义equals方法,因此它尝试“通过引用”查找它,这意味着您永远无法找到刚刚创建的项,因为它们始终位于内存中的不同位置
重写equals方法以包含id之类的内容,或者重写删除逻辑以删除最后一项(例如,您需要以某种方式找到您所指的项,然后才能将其删除)。在数组中执行.remove操作时,如果是通过引用而不是通过值来执行,则在执行.remove操作时应引用原始项() 执行此操作时,您正在创建一个类型为SeptegIDENuRunerModel的新对象,该对象与列表中的对象不同
var cikarilan = SepeteGidenUrunlerModel(
urunEklenen = urun.toString(),
fiyatEklenen = fiyat.toString()
)
您可以做的是首先通过引用获取元素,然后从列表中删除该对象。(类似于这样,它可能包含一些语法错误,因为我不使用Kotlin)
如果您的模型类没有定义适当的
equals
函数,则会通过引用相等进行比较,这意味着您在此单击侦听器中创建的新实例将与列表中的任何内容都不匹配,因此无法删除任何内容
将模型类
septegidenurunlermodel
声明为数据类
,这样它将在引擎盖下自动为其生成一个equals
函数。我理解,但当我尝试为循环编写时,比如:`for(I in septeeklenerunler中的I){if(I.uroneklenen==urun.toString()){septeeklenenurunler.remove(i)}}`。它也出现了错误。我真的不知道如何解决它。我的数组类型也是septegedineurunermodel。比如varsepteeklenenurunler=ArrayList()
。当我尝试使用$sign删除对象时,它也不起作用。@mehmett用可能的解决方案编辑了答案问题已经得到了回答,但我会记住你的答案。将septegidenurunermodel
设为数据类,以便为其生成适当的equals
函数,以便使用新创建的等效实例。它像一个符咒一样工作。你能写下答案让我检查一下吗。那么,如果我从模型中删除相等,它能工作吗?我的模型有空的相等字符串,这等于你说的答案吗?你说的“删除相等”是什么意思?
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)