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

如何从RecyclerView适配器传递LatLng至MapFragment的onActivityResult?

如何将RecyclerView中的LatLng传递给MapFragment的onActivityResult

嘿,我来帮你搞定这个问题!你已经在RecyclerView适配器里写了点击事件,现在需要把对应的LatLng传递给MapFragment的onActivityResult方法来展示地图。我分两种常见场景给你拆解步骤,还有更现代的替代方案推荐:


场景1:RecyclerView和MapFragment在不同Activity中

如果你的MapFragment是在独立的Activity里,那可以通过startActivityForResult(AndroidX推荐用registerForActivityResult)来传递数据,再手动触发MapFragment的onActivityResult:

步骤1:修改RecyclerView适配器的点击事件,携带LatLng启动目标Activity

把你的点击事件改成这样,把LatLng拆成经纬度值放到Intent里(因为LatLng默认不支持Parcelable,直接传double更简单):

holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 获取当前项的LatLng
        LatLng latLng = new LatLng(current.getLatitude(), current.getLongitude());
        
        // 启动MapFragment所在的Activity(假设是MapActivity)
        Intent intent = new Intent(view.getContext(), MapActivity.class);
        intent.putExtra("EXTRA_LAT", latLng.latitude);
        intent.putExtra("EXTRA_LNG", latLng.longitude);
        
        // 如果是在Fragment中,记得用getActivity()来启动;如果是Activity直接调用
        if (view.getContext() instanceof Activity) {
            ((Activity) view.getContext()).startActivityForResult(intent, 1001); // 1001是自定义请求码
        }
    }
});

步骤2:在MapActivity中接收数据,触发MapFragment的onActivityResult

在MapActivity的onCreate里拿到Intent的参数,然后手动调用MapFragment的onActivityResult:

public class MapActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        
        // 获取你的MapFragment实例
        MapFragment mapFragment = (MapFragment) getSupportFragmentManager().findFragmentById(R.id.map_fragment);
        
        // 从Intent中取出经纬度,重建LatLng
        double lat = getIntent().getDoubleExtra("EXTRA_LAT", 0.0);
        double lng = getIntent().getDoubleExtra("EXTRA_LNG", 0.0);
        LatLng targetLatLng = new LatLng(lat, lng);
        
        // 手动触发MapFragment的onActivityResult
        if (mapFragment != null) {
            Intent data = new Intent();
            data.putExtra("RESULT_LAT", targetLatLng.latitude);
            data.putExtra("RESULT_LNG", targetLatLng.longitude);
            mapFragment.onActivityResult(1001, Activity.RESULT_OK, data);
        }
    }
}

步骤3:在MapFragment的onActivityResult中处理地图展示

你的MapFragment已经实现了这个方法,现在只需要从Intent中取出数据,然后处理地图逻辑:

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    // 匹配请求码和结果码,确保是我们需要的回调
    if (requestCode == 1001 && resultCode == Activity.RESULT_OK && data != null) {
        double lat = data.getDoubleExtra("RESULT_LAT", 0.0);
        double lng = data.getDoubleExtra("RESULT_LNG", 0.0);
        LatLng targetLatLng = new LatLng(lat, lng);
        
        // 这里写你的地图展示逻辑,比如移动相机到目标位置
        if (googleMap != null) {
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(targetLatLng, 15));
        }
    }
}

场景2:RecyclerView和MapFragment在同一个Activity中(更常见)

如果两个组件在同一个Activity里,没必要绕onActivityResult,不过既然你指定要用这个方法,我们可以用接口回调来传递数据,再手动触发:

步骤1:给RecyclerView适配器添加点击回调接口

先在适配器里定义一个接口,让宿主(Activity/Fragment)能接收到点击事件和对应的LatLng:

public class YourPlacesAdapter extends RecyclerView.Adapter<YourPlacesAdapter.ViewHolder> {
    // 定义回调接口
    public interface OnPlaceClickListener {
        void onPlaceClicked(LatLng latLng);
    }
    
    private OnPlaceClickListener clickListener;
    
    // 设置回调的方法
    public void setOnPlaceClickListener(OnPlaceClickListener listener) {
        this.clickListener = listener;
    }
    
    // ... 你的其他适配器代码(比如ViewHolder、数据集合)
    
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        // 绑定你的数据到视图
        Place current = yourDataList.get(position);
        // ... 其他绑定逻辑
        
        // 修改点击事件,触发回调
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LatLng latLng = new LatLng(current.getLatitude(), current.getLongitude());
                if (clickListener != null) {
                    clickListener.onPlaceClicked(latLng);
                }
            }
        });
    }
    
    // ... ViewHolder类的代码
}

步骤2:在宿主Activity中实现回调,触发MapFragment的onActivityResult

在包含RecyclerView和MapFragment的Activity里,实现刚才的接口,然后手动调用MapFragment的onActivityResult:

public class MainActivity extends AppCompatActivity implements YourPlacesAdapter.OnPlaceClickListener {
    private MapFragment mapFragment;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 获取MapFragment实例
        mapFragment = (MapFragment) getSupportFragmentManager().findFragmentById(R.id.map_fragment);
        
        // 初始化RecyclerView和适配器
        RecyclerView recyclerView = findViewById(R.id.places_recycler);
        YourPlacesAdapter adapter = new YourPlacesAdapter(yourPlacesList);
        adapter.setOnPlaceClickListener(this); // 设置回调
        recyclerView.setAdapter(adapter);
        // ... 设置LayoutManager等
    }
    
    @Override
    public void onPlaceClicked(LatLng latLng) {
        // 手动触发MapFragment的onActivityResult
        if (mapFragment != null) {
            Intent data = new Intent();
            data.putExtra("RESULT_LAT", latLng.latitude);
            data.putExtra("RESULT_LNG", latLng.longitude);
            mapFragment.onActivityResult(1001, Activity.RESULT_OK, data);
        }
    }
}

步骤3:MapFragment的onActivityResult处理(和场景1一致)

同样在onActivityResult中取出LatLng,然后处理地图展示即可。


额外推荐:用ViewModel共享数据(更现代的方案)

如果你不需要严格使用onActivityResult,推荐用Jetpack的ViewModel来在Fragment之间共享数据,这种方式更简洁,也符合现代Android开发的最佳实践:

  1. 创建一个共享的ViewModel:
public class SharedMapViewModel extends ViewModel {
    private final MutableLiveData<LatLng> selectedPlace = new MutableLiveData<>();
    
    public void selectPlace(LatLng latLng) {
        selectedPlace.setValue(latLng);
    }
    
    public LiveData<LatLng> getSelectedPlace() {
        return selectedPlace;
    }
}
  1. 在RecyclerView所在的Fragment/Activity中设置数据:
// 获取ViewModel(注意要用requireActivity()作为ViewModelStoreOwner,确保是同一个实例)
SharedMapViewModel viewModel = new ViewModelProvider(requireActivity()).get(SharedMapViewModel.class);

// 在RecyclerView的点击事件中:
viewModel.selectPlace(latLng);
  1. 在MapFragment中观察数据变化:
SharedMapViewModel viewModel = new ViewModelProvider(requireActivity()).get(SharedMapViewModel.class);
viewModel.getSelectedPlace().observe(getViewLifecycleOwner(), latLng -> {
    // 处理地图展示逻辑
    if (googleMap != null) {
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15));
    }
});

这种方式不需要依赖onActivityResult,也不用手动触发回调,数据变化时会自动通知MapFragment,非常方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:34:03