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
相关产品推荐
相关产品推荐

