У вас много повторяющегося кода даже в этом небольшом примере. В общем, вы должны избегать копирования блоков кода и вместо этого извлекать их как отдельный метод. Сначала добавьте его в свой адаптер RecyclerView или там, где может достичь ваш onclick:
fun launchMapIntent(locationName: String) {
// determine package to open
val mapPkg = when {
isAppInstalled -> "com.google.android.apps.maps"
isLiteAppInstalled -> "com.google.android.apps.mapslite"
else -> null
}
val mapIntent = if(mapPkg != null) {
// open app
val gmmIntentUri = Uri.parse("geo:0,0?q=$locationName")
Intent(Intent.ACTION_VIEW, gmmIntentUri).setPackage(mapPkg)
} else {
// fallback to browser
val encLoc = Uri.encode(locationName)
val str = "https://www.google.com/maps/place/$encLoc/"
Intent(Intent.ACTION_VIEW, Uri.parse(str))
}
mCtx.startActivity(mapIntent)
}
Затем вы можете очистить дубликат кода из прослушивателя onclick:
ibMap.setOnClickListener {
when(tvTitle.text.toString()) {
"029" -> launchMapIntent("Cardiff, United Kingdom")
"030" -> launchMapIntent("other location...")
// other cases
}
}
В качестве альтернативы, если все ваши случаи карты открываются:
ibMap.setOnClickListener {
val locationName = when(tvTitle.text.toString()) {
"029" -> "Cardiff, United Kingdom"
"030" -> "other location..."
// other cases
}
launchMapIntent(locationName)
}
Вы могли бы дополнительно оптимизировать, сделав Map<Int, String>
с числами в качестве ключей и именами местоположений в качестве значений вместо огромного переключателя или каким-то образом удерживая их в базе данных и т. д. c