You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取RecyclerView条目经纬度实现点击跳转地图功能

RecyclerView条目点击唤起地图动态传参实现

你现有代码存在两处需要修正的点:

  • SearchViewHolder中初始化latit控件时漏写R.id前缀,会触发编译错误
  • 按钮点击逻辑中使用了固定硬编码坐标,没有读取当前条目的实际站点经纬度数据

具体修改方式

  1. 先修复控件初始化的笔误,将SearchViewHolder构造方法中的对应代码修改为:
latit = (TextView) itemView.findViewById(R.id.s_latit);
  1. 调整onBindViewHolder中的按钮点击逻辑:
    • 不要直接使用方法传入的position参数做点击位置取值,改用holder.getBindingAdapterPosition()获取当前条目的真实位置,避免列表增删动画时位置错位
    • 从sitesList中取出对应位置的站点对象,读取经纬度字段
    • 增加空值校验和Intent可用性判断,避免经纬度为空、设备无地图应用时出现崩溃
    • 按照geo URI规范拼接参数,注意标准格式为纬度在前,经度在后,还可以附带站点名称让地图自动标记点位

修正后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:06:20