已更新-问题中的代码现已生效
我试图在单击按钮后运行一个功能。该函数更新一个数组,如果数组不为空,我想运行下一行(下几行将我转移到另一个活动)。
我试图在filterPlaces
函数中打开新活动,但没有成功,startActivity
和Intent
不起作用。
这是更新数组的函数:
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开发。
有解决方案吗?是打开函数中的活动还是让函数先运行?
答案 0 :(得分:1)
发生了什么事?
在filterPlaces
中发出了异步请求,这就是方法本身立即返回并将控制权传递给下一个代码块的原因。
如何解决此问题?
将您的代码从另一个Activity
开始,移入成功侦听器的范围。更好的方法是将这段代码放在一个单独的方法中,然后根据需要调用它。
答案 1 :(得分:0)
将filterPlace
函数放置在Main Activity
类之外。在Main Activity
类中移动了该函数,并且该函数起作用了。