如何在适配器中调用 Activity 方法
How to call an Activity method in an Adapter
我正在做一个学校项目,我遇到了困难。
基本上,我需要按下一个按钮并打开一个 Google 带有与坐标关联的标记的地图。
要打开一个新的 MapActivity,我在 MainActivity 中使用它:
fun launchGoogleActivity(latitude : Double, longitude : Double, title: String): Boolean
{
val intent = Intent(this, MapsActivity::class.java).apply
{
putExtra("latitude", latitude)
putExtra("longitude", longitude)
putExtra("title", title)
}
startActivity(intent)
return true
}
在我的 MapActivity 中,我使用它来放置新标记:
val extras = intent.extras
val latitude: Double
val longitude: Double
val title: String
latitude = extras?.getString("latitude")?.toDouble()!!
longitude = extras.getString("longitude")?.toDouble()!!
title = extras.getString("name").toString()
val newPoint = LatLng(latitude, longitude)
mMap.addMarker(MarkerOptions().position(newPoint).title(title))
mMap.moveCamera(CameraUpdateFactory.newLatLng(newPoint))
我的适配器中有这些数据:
holder.buttonMap.setOnClickListener
{
val latitude = user?.location?.location?.latitude?.toDouble()
val longitude = user?.location?.location?.longitude?.toDouble()
val name : String = "Localisation de: " + user?.name?.nom + " " + user?.name?.prenom
}
如何在我的适配器中执行 launchGoogleActivity(latitude, longitude, name)
?
谢谢!
您可以使用以下代码从适配器启动 activity。
在您调用方法传递参数的 activity 内部
YourAdapter(this)
在参数中使用上下文
class CategoriesListAdapter(private val context: Context) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() { }
然后在您的 holder.buttonMap.setOnClickListener 方法中:
context.startActivity(Intent(context, SubCategoryActivity::class.java)
.putExtra(AppConstants.CATEGORY_ID, categoryData.getId())
.putExtra(AppConstants.CATEGORY_NAME, categoryData.getName()))
适配器中的传递函数
class YourAdapter(private val listener : (Double, Double,String) -> Unit) : RecyclerView.Adapter<RecyclerView.ViewHolder>()
在你的 viewHoler 中
val latitude = user?.location?.location?.latitude?.toDouble()
val longitude = user?.location?.location?.longitude?.toDouble()
val name : String = "Localisation de: " + user?.name?.nom + " " + user?.name?.prenom
holder.buttonMap.setOnClickListener {
listener(latitude,longitude,name)
}
并且在您设置适配器的 MainActivity 中
YourAdapter(){latitude: Double, longitude: Double, name: String -> launchMapActivity(latitude,longitude,name)}
将上下文添加到适配器的构造函数并在按钮上设置 onclicklistener。在其中添加此代码。
holder.buttonMap.setOnClickListener {
val intent = Intent(context,MapsActivity::class.java).apply {
putExtra("latitude", latitude)
putExtra("longitude", longitude)
putExtra("title", title)}
context.startActivity(intent)}
您可以从 activity 调用您的函数到您的适配器
在您的适配器中,添加我们将在您的 activity 中覆盖的接口 class。
class MarkerAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var callback: Callback? = null
inner class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
init {
holder.buttonMap.setOnClickListener{
callback?.onItemClick(user)
}
}
}
interface Callback {
fun onItemClick(user: User?)
}
}
然后在您的 activity 中,您只需要实现适配器的回调
class GoogleFragment() : MarkerAdapter.Callback {
override fun onItemClick(user: User?) {
val latitude = user?.location?.location?.latitude?.toDouble()
val longitude = user?.location?.location?.longitude?.toDouble()
val name : String = "Localisation de: " + user?.name?.nom + " " + user?.name?.prenom
}
}
添加上面的代码后,从您的 activity 中的适配器初始化回调 属性。
val adapter = MarkerAdapter()
adapter.callback = this
recylerView.adapter = adapter
我正在做一个学校项目,我遇到了困难。
基本上,我需要按下一个按钮并打开一个 Google 带有与坐标关联的标记的地图。
要打开一个新的 MapActivity,我在 MainActivity 中使用它:
fun launchGoogleActivity(latitude : Double, longitude : Double, title: String): Boolean
{
val intent = Intent(this, MapsActivity::class.java).apply
{
putExtra("latitude", latitude)
putExtra("longitude", longitude)
putExtra("title", title)
}
startActivity(intent)
return true
}
在我的 MapActivity 中,我使用它来放置新标记:
val extras = intent.extras
val latitude: Double
val longitude: Double
val title: String
latitude = extras?.getString("latitude")?.toDouble()!!
longitude = extras.getString("longitude")?.toDouble()!!
title = extras.getString("name").toString()
val newPoint = LatLng(latitude, longitude)
mMap.addMarker(MarkerOptions().position(newPoint).title(title))
mMap.moveCamera(CameraUpdateFactory.newLatLng(newPoint))
我的适配器中有这些数据:
holder.buttonMap.setOnClickListener
{
val latitude = user?.location?.location?.latitude?.toDouble()
val longitude = user?.location?.location?.longitude?.toDouble()
val name : String = "Localisation de: " + user?.name?.nom + " " + user?.name?.prenom
}
如何在我的适配器中执行 launchGoogleActivity(latitude, longitude, name)
?
谢谢!
您可以使用以下代码从适配器启动 activity。
在您调用方法传递参数的 activity 内部
YourAdapter(this)
在参数中使用上下文
class CategoriesListAdapter(private val context: Context) :
RecyclerView.Adapter<RecyclerView.ViewHolder>() { }
然后在您的 holder.buttonMap.setOnClickListener 方法中:
context.startActivity(Intent(context, SubCategoryActivity::class.java)
.putExtra(AppConstants.CATEGORY_ID, categoryData.getId())
.putExtra(AppConstants.CATEGORY_NAME, categoryData.getName()))
适配器中的传递函数
class YourAdapter(private val listener : (Double, Double,String) -> Unit) : RecyclerView.Adapter<RecyclerView.ViewHolder>()
在你的 viewHoler 中
val latitude = user?.location?.location?.latitude?.toDouble()
val longitude = user?.location?.location?.longitude?.toDouble()
val name : String = "Localisation de: " + user?.name?.nom + " " + user?.name?.prenom
holder.buttonMap.setOnClickListener {
listener(latitude,longitude,name)
}
并且在您设置适配器的 MainActivity 中
YourAdapter(){latitude: Double, longitude: Double, name: String -> launchMapActivity(latitude,longitude,name)}
将上下文添加到适配器的构造函数并在按钮上设置 onclicklistener。在其中添加此代码。
holder.buttonMap.setOnClickListener {
val intent = Intent(context,MapsActivity::class.java).apply {
putExtra("latitude", latitude)
putExtra("longitude", longitude)
putExtra("title", title)}
context.startActivity(intent)}
您可以从 activity 调用您的函数到您的适配器
在您的适配器中,添加我们将在您的 activity 中覆盖的接口 class。
class MarkerAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var callback: Callback? = null
inner class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
init {
holder.buttonMap.setOnClickListener{
callback?.onItemClick(user)
}
}
}
interface Callback {
fun onItemClick(user: User?)
}
}
然后在您的 activity 中,您只需要实现适配器的回调
class GoogleFragment() : MarkerAdapter.Callback {
override fun onItemClick(user: User?) {
val latitude = user?.location?.location?.latitude?.toDouble()
val longitude = user?.location?.location?.longitude?.toDouble()
val name : String = "Localisation de: " + user?.name?.nom + " " + user?.name?.prenom
}
}
添加上面的代码后,从您的 activity 中的适配器初始化回调 属性。
val adapter = MarkerAdapter()
adapter.callback = this
recylerView.adapter = adapter