You need to enable JavaScript to run this app. Kotlin中如何在RecyclerView Adapter的onMapReady方法内获取当前项位置
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何在RecyclerView Adapter的onMapReady方法内获取当前项位置

解决方法

Kotlin会自动将Java类的无参getter方法转换为属性调用,你在Java中使用的getAdapterPosition()方法,在Kotlin中对应adapterPosition属性,直接调用即可。
由于onMapReady是异步回调,触发时当前RecyclerView.ViewHolder可能已经被滚动出屏幕回收,此时adapterPosition会返回无效值RecyclerView.NO_POSITION(值为-1),必须增加判断避免数组越界崩溃。

最优实现方案

建议在ViewHolder的bind方法中提前存储当前绑定的位置,避免异步回调时位置失效,修改后的代码参考如下:

// 代码写在RecyclerView.Adapter的内部ViewHolder类中
override fun onMapReady(googleMap: GoogleMap?) {
    println("onMapReady")
    // 空安全校验,避免googleMap为空崩溃
    googleMap ?: return
    // 方式1:直接调用Kotlin转换后的属性(对应Java的getAdapterPosition())
    val currentPosition = adapterPosition
    // 方式2:使用bind方法提前存储的位置(更稳妥,推荐)
    // val currentPosition = bindPosition

    // 校验位置有效性
    if (currentPosition == RecyclerView.NO_POSITION || currentPosition >= locations.size) {
        return
    }
    // 读取对应位置的数据
    val location = locations[currentPosition]
    val targetLatLng = LatLng(location.latitude, location.longitude)
    googleMap.addMarker(MarkerOptions().position(targetLatLng).title(location.title))
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(targetLatLng,13.5f))
}

// ViewHolder的bind方法示例
fun bind(position: Int) {
    // 存储当前绑定的位置
    bindPosition = position
    // 其他列表项绑定逻辑
}

注意事项

  • 不要使用!!强行解包可空的googleMap参数,改用空安全校验提前返回,避免地图初始化失败时出现崩溃
  • 如果列表项存在复用逻辑,建议在onViewRecycled回调中清理地图相关资源,避免内存泄漏
  • 数据集locations变更后必须调用对应的notifyXXX方法刷新列表,否则位置会和数据不匹配

内容的提问来源于stack exchange,提问作者DIGITAL JEDI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 06:24:03