Kotlin- Function在下一行结束后运行

时间:2019-05-14 11:28:13

标签: android function android-activity kotlin buttonclick

已更新-问题中的代码现已生效

我试图在单击按钮后运行一个功能。该函数更新一个数组,如果数组不为空,我想运行下一行(下几行将我转移到另一个活动)。

我试图在filterPlaces函数中打开新活动,但没有成功,startActivityIntent不起作用。

这是更新数组的函数:

var places = ArrayList<Place>() //Global place array
class MainActivity : AppCompatActivity() {

    fun filterPlaces(types: ArrayList<String>, foods: ArrayList<String>, maxPrice: Int, maxProximity: Int) {
        var typesList = types
        val foodList = foods
        if (types.isEmpty()) {
            typesList = arrayListOf("Restaurant", "Hangouts")
            if (foods.isEmpty()) {
                foodList.add("Pizza")
            }
        }
        val db = FirebaseFirestore.getInstance()
        db.collection("places").get().addOnSuccessListener { result ->
            for (document in result) {
                val typeMatches = document.data["Type"].toString() in typesList
                val foodMatches = document.data["Food"].toString() in foodList
                var price = 0
                when (document.data["Price"].toString()) {
                    "Very cheap" -> price = 0
                    "Cheap" -> price = 1
                    "Average" -> price = 2
                    "Far" -> price = 3
                    "Very far" -> price = 4
                }
                val priceMatches = price <= maxPrice
                var proximity = 0
                when (document.data["Proximity"].toString()) {
                    "Very close" -> proximity = 0
                    "Close" -> proximity = 1
                    "Far" -> proximity = 2
                    "Very far" -> proximity = 3
                }
                val proximityMatches = proximity <= maxProximity
                if (typeMatches and foodMatches and priceMatches and proximityMatches) {
                    val place = Place(
                        document.data["Place"].toString(),
                        document.data["Type"].toString(),
                        document.data["Food"].toString(),
                        document.data["Price"].toString(),
                        document.data["Proximity"].toString()
                    )
                    places.add(place)
                    Log.d("name", "Place added successfully")
                }
            }

            //Openning the results activity
            if (places.isNotEmpty()) {
                val i = Intent(this, RelevantPlaces::class.java)
                val b = Bundle()
                b.putParcelableArrayList("places", places)
                i.putExtra("bundle", b)
                startActivity(i)
            }
        }
            .addOnFailureListener { exception ->
                Log.d("name", "Error getting documents.")
            }
    }

这是单击功能:

fun onSortFilterClicked(view: View) {
        if (places.isEmpty()) filterPlaces(types, foods, priceRange.progress, proximityRange.progress)
    }

我想先运行filterPlaces,在运行时更新places数组,然后只检查该数组是否仍然为空以及是否不打开新活动。 实际发生的是,它调用了filterPlaces却没有执行,而是检查了places数组(代码中的if condition),然后才进入{{1}并运行其中的内容,导致我需要在按钮上按两次,并且仅比数组具有值。 我正在Android Studio上运行此代码,并且在Kotlin世界中还是新手,并且一般情况下都是android开发。

有解决方案吗?是打开函数中的活动还是让函数先运行?

2 个答案:

答案 0 :(得分:1)

发生了什么事?

filterPlaces中发出了异步请求,这就是方法本身立即返回并将控制权传递给下一个代码块的原因。

如何解决此问题?

将您的代码从另一个Activity开始,移入成功侦听器的范围。更好的方法是将这段代码放在一个单独的方法中,然后根据需要调用它。

答案 1 :(得分:0)

filterPlace函数放置在Main Activity类之外。在Main Activity类中移动了该函数,并且该函数起作用了。