簡體   English   中英

為什么我不能在 Kotlin 中讀取我的 ArrayList 的內容

[英]Why can't I read the contents of my ArrayList in Kotlin

我正在我的 Android 活動中從 Firestore 數據庫讀取數據並將數據存儲在ArrayList但是當我打印出ArrayList時,我打印了最后一個條目,而沒有其他條目。

這是我的 Kotlin 代碼:

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_counties)

        var sites : ArrayList<Site> = ArrayList<Site>()
        var site : Site = Site()

        val selectedCounty: String = intent.getStringExtra("COUNTY")

        sites.clear()

        db.collection("UKSites")
            .document("England")
            .collection("Counties")
            .document(selectedCounty)
            .collection(selectedCounty)
            .get()
            .addOnSuccessListener { documents ->
                for (document in documents) {

                    site.name = document.data["Name"].toString()
                    site.address?.line1 = document.data["Address Line 1"].toString()
                    site.address?.line2 = document.data["Address Line 2"].toString()
                    site.address?.line3 = document.data["Address Line 3"].toString()
                    site.address?.line4 = document.data["Address Line 4"].toString()
                    site.address?.postcode = document.data["Postcode"].toString()
                    site.address?.phoneNumber = document.data["Telephone"].toString()
                    site.address?.siteURL = document.data["Site URL"].toString()
                    site.description = document.data["Description"].toString()
                    site.price = document.data["Price"] as Double
                    site.distance = 0
                    site.locationCoordinate?.Longitude = document.data["Longitude"] as Double
                    site.locationCoordinate?.Latitude = document.data["Latitude"] as Double

                    sites.add(site)

                    Log.i("Info","${sites.last().name}")

                }

                Log.i("Info", "${sites.size}")

                for ( nextSite in sites ) {
                    Log.i("Info", "site.name = ${nextSite.name}")
                }

                // Recycler View code here
            }
            .addOnFailureListener { exception ->
                Log.w("Error", "Error getting documents: ", exception)
            }

這是打印到Logcat窗口的輸出:

    2020-01-18 15:22:14.376 10629-10658/com.riverstonetech.gositeuk D/FA:   Logging event (FE): screen_view(_vs), Bundle[{ga_event_origin(_o)=auto,   ga_previous_class(_pc)=CountriesActivity,  ga_previous_id(_pi)=-7126357891560843792,  ga_screen_class(_sc)=CountiesActivity, ga_screen_id(_si)=-7126357891560843791}]
    2020-01-18 15:22:14.396 10629-10629/com.riverstonetech.gositeuk  I/Info: Stroud Farm
    2020-01-18 15:22:14.399 10629-10629/com.riverstonetech.gositeuk I/Info: Bennets Wood Farm
    2020-01-18 15:22:14.401 10629-10629/com.riverstonetech.gositeuk I/Info: Bluebell Farm
    2020-01-18 15:22:14.404 10629-10629/com.riverstonetech.gositeuk I/Info: Pinecopse Kennels
    2020-01-18 15:22:14.407 10629-10629/com.riverstonetech.gositeuk I/Info: Pinecopse Kennels
    2020-01-18 15:22:14.410 10629-10629/com.riverstonetech.gositeuk I/Info: Bennets Wood Farm
    2020-01-18 15:22:14.414 10629-10629/com.riverstonetech.gositeuk I/Info: Bluebell Farm
    2020-01-18 15:22:14.416 10629-10629/com.riverstonetech.gositeuk I/Info: Stroud Farm
    2020-01-18 15:13:20.486 10221-10221/com.riverstonetech.gositeuk I/Info: 8
    2020-01-18 15:13:20.486 10221-10221/com.riverstonetech.gositeuk I/Info: site.name = Stroud Farm
    2020-01-18 15:13:20.486 10221-10221/com.riverstonetech.gositeuk I/Info: site.name = Stroud Farm
    2020-01-18 15:13:20.486 10221-10221/com.riverstonetech.gositeuk I/Info: site.name = Stroud Farm
    2020-01-18 15:13:20.486 10221-10221/com.riverstonetech.gositeuk I/Info: site.name = Stroud Farm
    2020-01-18 15:13:20.486 10221-10221/com.riverstonetech.gositeuk I/Info: site.name = Stroud Farm
    2020-01-18 15:13:20.486 10221-10221/com.riverstonetech.gositeuk I/Info: site.name = Stroud Farm
    2020-01-18 15:13:20.486 10221-10221/com.riverstonetech.gositeuk I/Info: site.name = Stroud Farm
    2020-01-18 15:13:20.487 10221-10221/com.riverstonetech.gositeuk I/Info: site.name = Stroud Farm
    2020-01-18 15:13:20.502 10221-10252/com.riverstonetech.gositeuk D/EGL_emulation:     eglMakeCurrent: 0xae085060: ver 3 0 (tinfo 0xae083400)
    2020-01-18 15:13:20.524 10221-10252/com.riverstonetech.gositeuk D/EGL_emulation: eglMakeCurrent: 0xae085060: ver 3 0 (tinfo 0xae083400)
    2020-01-18 15:13:20.578 10221-10252/com.riverstonetech.gositeuk D/EGL_emulation: eglMakeCurrent: 0xae085060: ver 3 0 (tinfo 0xae083400)

您只創建了一次Site的對象。 因此,在循環中使用時,您只是一次又一次地重置同一對象的值。 這就是您從循環中獲取最后一個元素的值的原因。

每次都需要創建對象。 所以var site : Site = Site()必須在 for-each 循環內。 如下

for (document in documents) {
   // Create object here
   var site : Site = Site()
   // Then do your tasks what is currently doing
   site.name = document.data["Name"].toString()
   ....

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM