Object 添加覆盖MutableList中列表的所有项
我有一个包含可变列表的对象Object 添加覆盖MutableList中列表的所有项,object,kotlin,mutablelist,Object,Kotlin,Mutablelist,我有一个包含可变列表的对象 object TrackingEventsList { var EventDate: String = "" var EventDescription: String = "" } object Waybill { var WaybillNumber: String = "" var OriginHub: String = "" var TrackingEvents: MutableList<TrackingEvents
object TrackingEventsList {
var EventDate: String = ""
var EventDescription: String = ""
}
object Waybill {
var WaybillNumber: String = ""
var OriginHub: String = ""
var TrackingEvents: MutableList<TrackingEventsList> = ArrayList()
}
调用fillTracking 3次后的结果:
Waybill.TrackingEvents[0].EventDescription = "Event3"
Waybill.TrackingEvents[1].EventDescription = "Event3"
Waybill.TrackingEvents[2].EventDescription = "Event3"
Kotlin中的
对象
是一个单例,这意味着您无法对其进行初始化,并且它全局只有一个实例。因此,当您更改单个实例的项时,您将覆盖以前的数据
您应该将两者(或至少TrackingEventsList)改为class
。如果Waybill
的变量是实例敏感的,那么它也需要是一个类。但是在您添加的代码中,我找不到任何可以说您将其作为一个单例使用的内容,所以我将其作为一个单例使用
class TrackingEventsList (
var eventDate: String = "",
var eventDescription: String = "")
/**
* Also want to point out that this is still a singleton. If the data inside is instance-specific, you need to change it
* to a class.
*/
object Waybill {
var waybillNumber: String = ""
var originHum: String = ""
var trackingEvents: MutableList<TrackingEventsList> = ArrayList()
}
private fun fillTracking(events: NodeList) {
val item = TrackingEventsList()
for (x: Int in 0 until events.length) {
var tName = (events.item(x) as Element).tagName
var event = (events.item(x).firstChild as Text).wholeText
if (tName == "EventDate") {
item.eventDate = event
}
if (tName == "EventDescription") {
item.eventDescription = event
}
}
Waybill.trackingEvents.add(item)
}
类跟踪事件列表(
var eventDate:String=“”,
var eventDescription:String=“”)
/**
*还想指出的是,这仍然是单身。如果其中的数据是特定于实例的,则需要对其进行更改
*去上课。
*/
实物运单{
var waybillNumber:String=“”
var originHum:String=“”
var trackingEvents:MutableList=ArrayList()
}
私人娱乐跟踪(活动:节点列表){
val item=TrackingEventsList()
for(0中的x:Int直到events.length){
var tName=(events.item(x)作为元素)。标记名
var event=(events.item(x).firstChild作为文本)。wholeText
如果(tName==“EventDate”){
item.eventDate=事件
}
if(tName==“EventDescription”){
item.eventDescription=事件
}
}
运单.跟踪事件.添加(项目)
}
你应该研究一下Kotlin的命名约定;字段永远不会以大写字母开头,除非它是一个静态常量(在这种情况下,它都是大写的)因为
TrackingEventsList
是一个对象,这意味着它是一个单例(或者只有一个实例)。当您遍历循环时,您总是在更新TrackingEventsList
对象的同一个实例
将跟踪事件列表更改为:
data class TrackingEventsList(var eventDate: String, var eventDescription: String)
每次循环时创建一个新实例,然后将其添加到末尾的列表中:
private fun fillTracking(events: NodeList) {
var eventDate: String = ""
var eventDescription: String = ""
for (x: Int in 0 until events.length) {
val tName = (events.item(x) as Element).tagName
val event = (events.item(x).firstChild as Text).wholeText
if (tName == "EventDate") {
eventDate = event
}
if (tName == "EventDescription") {
eventDescription = event
}
}
Waybill.TrackingEvents.plus(TrackingEventsList(eventDate, eventDescription))
}
谢谢当我改为以小写字母开头时,Android Studio建议我,类名“waybill”应该以大写字母开头。我很清楚,因为我对Kotlin很陌生,如果我将Waybill更改为一个类,那么我需要初始化它并将它从一个片段传递到另一个片段?@CraigP我说的是字段,而不是类。类、接口、对象和枚举应以大写字母开头。字段(var和val)应以小写字母开头,除非它是静态和常量。Kotlin的完整样式指南/编码约定列表可在此处找到:看起来这两个都应该是类,而不是对象,FWIW。@LouisWasserman也这么认为,但没有看到更多的运单使用,我的代码基于它被设计成一个单身汉。但是仍然包括了这一部分(如果字段是实例敏感的,那么它也应该是一个类)谢谢,类和数据类之间的区别是什么?数据类自动添加一些有用的函数,并有一些额外的限制。当您创建一个类只是为了保存一些值时,数据类是一个很好的选择。更多信息:谢谢,非常感谢
private fun fillTracking(events: NodeList) {
var eventDate: String = ""
var eventDescription: String = ""
for (x: Int in 0 until events.length) {
val tName = (events.item(x) as Element).tagName
val event = (events.item(x).firstChild as Text).wholeText
if (tName == "EventDate") {
eventDate = event
}
if (tName == "EventDescription") {
eventDescription = event
}
}
Waybill.TrackingEvents.plus(TrackingEventsList(eventDate, eventDescription))
}