Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Object 添加覆盖MutableList中列表的所有项_Object_Kotlin_Mutablelist - Fatal编程技术网

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