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

Android应用需求:RecyclerView点击跳转地图展示对应周边场所

Alright, let's get this sorted. Your app currently jumps to a map showing the user's current location when clicking a RecyclerView item, and now you want that map to display the corresponding nearby places (like restaurants, hospitals, bars) based on which image was tapped. Here's how to implement this step by step:

1. Pass the Place Type from RecyclerView to Map Activity

First, you need to tell the map screen which category of places to load. Start by defining a clear way to identify each place type—an enum works perfectly here:

// Define this in a separate file or inside your Adapter class
enum class PlaceCategory {
    RESTAURANT, HOSPITAL, BAR
}

Then, in your RecyclerView Adapter's onBindViewHolder, add a click listener that sends the selected category to the map activity via an Intent:

override fun onBindViewHolder(holder: PlaceViewHolder, position: Int) {
    val currentCategory = categories[position] // Assume categories is your list of PlaceCategory items
    holder.itemView.setOnClickListener {
        val intent = Intent(context, MapActivity::class.java)
        intent.putExtra("SELECTED_PLACE_CATEGORY", currentCategory)
        context.startActivity(intent)
    }
}

2. Receive the Category in the Map Activity

In your map activity, grab the passed category when the activity starts. Then, integrate it with your existing current-location logic:

class MapActivity : AppCompatActivity() {
    private lateinit var map: GoogleMap
    private var selectedCategory: PlaceCategory? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_map)

        // Retrieve the selected category from the intent
        selectedCategory = intent.getSerializableExtra("SELECTED_PLACE_CATEGORY") as? PlaceCategory

        // Initialize your map (you probably already have this code)
        val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync { googleMap ->
            map = googleMap
            // First get the user's current location (your existing logic)
            fetchCurrentLocationAndLoadPlaces()
        }
    }
}

3. Load and Display Corresponding Nearby Places

Once you have the user's current location and the selected category, use your map API (e.g., Google Places, Amap) to search for nearby places and add markers to the map. Here's an example with Google Places API:

private fun fetchCurrentLocationAndLoadPlaces() {
    // Use FusedLocationProviderClient to get the user's current location (your existing code)
    val fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
    fusedLocationClient.lastLocation.addOnSuccessListener { location ->
        location?.let {
            val userLatLng = LatLng(it.latitude, it.longitude)
            // Move map to user's location (your existing logic)
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(userLatLng, 15f))

            // Load places based on the selected category
            selectedCategory?.let { category ->
                loadNearbyPlaces(userLatLng, category)
            }
        }
    }
}

private fun loadNearbyPlaces(userLatLng: LatLng, category: PlaceCategory) {
    // Map your enum to the API's place type string
    val apiPlaceType = when(category) {
        PlaceCategory.RESTAURANT -> "restaurant"
        PlaceCategory.HOSPITAL -> "hospital"
        PlaceCategory.BAR -> "bar"
    }

    // Build the nearby search request
    val request = NearbySearchRequest()
        .location(userLatLng)
        .radius(5000) // Search within 5km (adjust as needed)
        .type(apiPlaceType)

    // Execute the request and add markers to the map
    Places.createClient(this).findCurrentPlace(request, null).addOnSuccessListener { response ->
        response.placeLikelihoods.forEach { likelihood ->
            val place = likelihood.place
            val placeLatLng = LatLng(place.latLng?.latitude ?: 0.0, place.latLng?.longitude ?: 0.0)
            map.addMarker(MarkerOptions()
                .position(placeLatLng)
                .title(place.name)
                .snippet(place.address))
        }
    }.addOnFailureListener {
        // Handle errors (e.g., no internet, API key issues)
        Toast.makeText(this, "Failed to load nearby places", Toast.LENGTH_SHORT).show()
    }
}

Quick Notes to Avoid Headaches

  • Make sure your app has the necessary permissions: ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION to get the user's current location.
  • Double-check that your map API key is correctly set up and has access to the Places API (if using Google Maps).
  • If you're using a different map SDK (like Amap or Baidu Maps), adjust the search method to match that SDK's documentation—the core logic (pass category → receive → search → mark) stays the same.

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:40:15