如何获取RecyclerView条目经纬度实现点击跳转地图功能
RecyclerView条目点击唤起地图动态传参实现
你现有代码存在两处需要修正的点:
SearchViewHolder中初始化latit控件时漏写R.id前缀,会触发编译错误- 按钮点击逻辑中使用了固定硬编码坐标,没有读取当前条目的实际站点经纬度数据
具体修改方式
- 先修复控件初始化的笔误,将
SearchViewHolder构造方法中的对应代码修改为:
latit = (TextView) itemView.findViewById(R.id.s_latit);
- 调整
onBindViewHolder中的按钮点击逻辑:- 不要直接使用方法传入的
position参数做点击位置取值,改用holder.getBindingAdapterPosition()获取当前条目的真实位置,避免列表增删动画时位置错位 - 从
sitesList中取出对应位置的站点对象,读取经纬度字段 - 增加空值校验和Intent可用性判断,避免经纬度为空、设备无地图应用时出现崩溃
- 按照
geoURI规范拼接参数,注意标准格式为纬度在前,经度在后,还可以附带站点名称让地图自动标记点位
- 不要直接使用方法传入的
修正后的onBindViewHolder完整代码如下:
@Override public void onBindViewHolder(@NonNull SearchViewHolder holder, int position) { Sites currentSite = sitesList.get(position); holder.sitecode.setText(currentSite.getSitecode()); holder.address.setText(currentSite.getAddress()); holder.lonit.setText(currentSite.getLonit()); holder.latit.setText(currentSite.getLatit()); holder.note.setText(currentSite.getNote()); holder.visitLocation.setOnClickListener(view -> { // 获取点击条目的真实位置 int adapterPosition = holder.getBindingAdapterPosition(); if (adapterPosition == RecyclerView.NO_POSITION) return; Sites clickSite = sitesList.get(adapterPosition); String latStr = clickSite.getLatit(); String lonStr = clickSite.getLonit(); String address = clickSite.getAddress(); // 校验经纬度非空 if (latStr == null || lonStr == null || latStr.isEmpty() || lonStr.isEmpty()) return; try { double lat = Double.parseDouble(latStr.trim()); double lon = Double.parseDouble(lonStr.trim()); // 拼接geo URI,附带地址作为点位标签 Uri geoUri = Uri.parse("geo:" + lat + "," + lon + "?q=" + lat + "," + lon + "(" + address + ")"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, geoUri); // 设置Intent标记,适配从非Activity上下文启动 mapIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 校验设备上有可处理该Intent的地图应用 if (mapIntent.resolveActivity(context.getPackageManager()) != null) { context.startActivity(mapIntent); } } catch (NumberFormatException e) { // 经纬度格式非法时的异常捕获 e.printStackTrace(); } }); }
补充说明
- 该实现会自动唤起设备上所有支持geo协议的地图应用(高德、百度、谷歌地图等均支持该协议),弹出应用选择框供用户选择
- 经纬度字段如果在数据库中存储的是double类型,可以直接取值,不需要做字符串转double的操作
- 如果需要指定打开某一款地图应用,可以对应修改URI为对应地图的专属scheme格式
内容的提问来源于stack exchange,提问作者Wisam Jaradat
相关产品推荐
相关产品推荐

