2013-05-23 26 views
6

Tôi có một ArrayList của một lớp tùy chỉnh. Có khoảng 10 đối tượng trong danh sách, mỗi đối tượng có các chi tiết như Tiêu đề, Đoạn trích, LatLng. Tôi đã thêm thành công tất cả 10 vào Bản đồ bằng cách sử dụng các hàm lớp tùy chỉnh của tôi như getTitle, getSnippet, getLatLng, v.v.Phân biệt giữa các điểm đánh dấu khác nhau trong API Maps v2 (số nhận dạng duy nhất)

Bây giờ, khi tôi nhấp vào cửa sổ thông tin (của điểm đánh dấu), tôi muốn có thể bằng cách nào đó BIẾT đối tượng của lớp tùy chỉnh của tôi làm điểm đánh dấu đó tương ứng với.

Ví dụ: nếu tôi nhấp vào thị trường McDonald's, tôi muốn có thể biết mục nào từ ArrayList của tôi đã làm điểm đánh dấu đó thuộc về.

Tôi đã xem xét MarkerOptions và dường như không có bất kỳ thứ gì trong đó mà tôi có thể sử dụng để xác định đối tượng tùy chỉnh có liên quan.

Nếu câu hỏi là quá khó hiểu, hãy để tôi làm cho nó đơn giản:

ArrayList<CustomObj> objects = blah 
map.addMarker(new MarkerOptions().position(new LatLng(
          Double.parseDouble(result.get(i).getCompanyLatLng() 
            .split(",")[0]), Double.parseDouble(result 
            .get(i).getCompanyLatLng().split(",")[1]))) 
            .title(result.get(i).getCompanyName()) 
            .snippet(result.get(i).getCompanyType()) 
            .icon(BitmapDescriptorFactory 
              .fromResource(R.drawable.pin))); 

Bây giờ khi điều này được nhấp, tôi đi sang trang tiếp theo. Trang tiếp theo cần biết WHICH đối tượng đã được nhấp để tôi có thể gửi các chi tiết khác cho trang đó (ví dụ: URL hình ảnh cần được tải v.v.).

Làm cách nào để thêm một số nguyên duy nhất hoặc bất kỳ số nhận dạng nào vào điểm đánh dấu của tôi?

+0

mMap.setOnMarkerClickListener (OnMarkerClickListener mới() \t \t \t { \t \t \t \t \t \t @ Override \t \t \t \t \t \t public boolean onMarkerClick (Marker arg0) { \t \t \t \t \t \t \t if (arg0.getTitle() equals ("đánh dấu 1 danh hiệu").) \t \t \t \t \t \t Toast.makeText (MainActivity.this, arg0.getTitle(), 1000) .show(); \t \t \t \t \t \t \t trả lại đúng; \t \t \t \t \t \t} \t \t \t \t \t \t \t}); bạn có thể sử dụng trình nghe đánh dấu để kiểm tra và sử dụng tiêu đề để so sánh để biết điểm đánh dấu nào đã được nhấp vào – Raghunandan

+1

:) Tiêu đề không phải lúc nào cũng duy nhất trong trường hợp của tôi và do đó không thể được sử dụng cho mục đích này. – Asim

+0

bạn có thể sử dụng getId() trong trường hợp đó. – Raghunandan

Trả lời

6

Một cách chính xác là sử dụng Map<Marker, CustomObj> mà các cửa hàng tất cả các dấu hiệu:

Marker marker = map.addMarker(...); 
map.put(marker, result.get(i)); 

và trong onInfoWindowClick:

CustomObj obj = map.get(marker); 

thử khác là sử dụng Android Maps Extensions, thêm phương thức getDatasetData vào Marker, vì vậy bạn có thể chỉ định CustomObj đối tượng sau khi tạo điểm đánh dấu và truy xuất nó trong bất kỳ cuộc gọi lại nào.

+0

Tôi đã sử dụng tiện ích mở rộng bản đồ. Tôi ước google sẽ sửa lỗi này. – Asim

+0

@ Asim Tôi không nghĩ đây không phải là thứ cần sửa chữa.Nếu các hàm như vậy ('getData' và' setData') nằm trong thư viện gốc, tất cả các đối tượng của bạn sẽ phải là 'Parcelable' và sẽ mất thêm thời gian để gửi chúng qua IPC tới Google Play Services. Sử dụng 'Bản đồ' là một cách giải quyết tốt, Tiện ích mở rộng bản đồ của Android chỉ làm việc này thuận lợi hơn. –

1

Tôi đã sử dụng văn bản đoạn trích để lưu ID duy nhất. Nếu bạn cần đoạn mã thì nó sẽ xuất hiện và bạn có thể tự tạo cho mình (bằng cách tìm đối tượng từ ID) để bạn không bỏ lỡ nó nhưng chắc chắn bạn sẽ bỏ lỡ một ID duy nhất để nhận diện các đối tượng.

Để tìm đúng đối tượng tôi chỉ lặp qua chúng:

for(SomeObject anObject : someObjects) { 
    if(marker.getSnippet().equalsIgnoreCase(anObject.getID())) { 
     //you got at match 
    } 
} 
+0

Nhưng tôi đã có thông tin trong đoạn .. Thông tin hữu ích cần được hiển thị – Asim

+0

@Asim bạn có thể nhận được thông tin đó từ đối tượng cũng đúng không? Kê đên mang no đi tư bên đo. Bạn chỉ cần thông tin khi bạn hiển thị nó. – Warpzit

0

Tôi nghĩ rằng sử dụng vĩ độ và kinh độ, điều này có thể được thực hiện

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 

     @Override 
     public boolean onMarkerClick(final Marker marker) { 
      LatLng pos = marker.getPosition(); 
      int arryListPosition = getArrayListPosition(pos); 
      return true; 
     } 
    }); 

và phương pháp getArrayListPosition

private int getArrayListPosition(LatLng pos) { 
    for (int i = 0; i < result.size(); i++) { 
     if (pos.latitude == result.get(i).getCompanyLatLng().split(",")[0]) { 
      if (pos.longitude == result.get(i).getCompanyLatLng() 
        .split(",")[1]) 
       return i; 
     } 
    } 
    return 0; 
} 

Phương pháp này sẽ trả lại vị trí của bạn ArrayList ai là Marker bạn đã nhấp vào. và bạn có thể lấy dữ liệu từ vị trí đó.

Hy vọng nó sẽ giúp ...

+0

Đây là một ý tưởng hay. Tôi sẽ thử và đánh dấu câu trả lời của bạn đúng nếu nó hoạt động tốt. – Asim

+1

Nhưng nếu bạn có 2 điểm đánh dấu cùng một chỗ bạn đã bị vặn. Đây chắc chắn không phải là lựa chọn tốt nhất so với việc sử dụng tiêu đề hoặc đoạn trích. – Warpzit

+0

@Warpzit: vâng bạn đúng. Nhưng nếu bạn đang thêm 2 hoặc nhiều điểm đánh dấu tại cùng một LatLng, thì mục đích của nó là gì. Điểm đánh dấu được sử dụng để hiển thị một số điểm trên bản đồ. Vì vậy, một Latlng tương tự sẽ trỏ đến cùng một vị trí và tôi nghĩ rằng dữ liệu cho điểm đó sẽ giống nhau cho tất cả các điểm đánh dấu. –

1

Theo các cuộc thảo luận tại liên kết sau, Marker.equals và Marker.hashCode không hoạt động đôi khi. Ví dụ: khi bản đồ được quét hoặc thu phóng hoặc bản đồ được khởi động lại/tiếp tục lại.

Add Tag/Identifier to Markers

Vì vậy, ID Marker là một chìa khóa tốt hơn so với Marker bản thân cho một HashMap.

Map<String, MyObject> markerMap = new HashMap<String, MyObject>(); 
Marker marker = map.addMarker(...); 
MyObject myObject = new MyObject(); 
markerMap.put(marker.getId(), myObject); 
0

tôi 4 năm muộn để trả lời nhưng tôi thực sự ngạc nhiên tại sao không ai nói về marker.setTagmarker.getTag phương pháp.

Theo văn bản trong tài liệu google API,

Đây là dễ dàng hơn lưu trữ một riêng biệt Map<Marker, Object>

Họ có giới thiệu setTaggetTag để tránh sử dụng Map<...>. Bạn có thể sử dụng nó như sau.

Marker marker = map.addMarker(...); 
marker.setTag(result.get(i)); //Store your marker information here. 

//To fetch your object... 
map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
    @Override 
    public boolean onMarkerClick(Marker marker) { 
     CustomObj obj = (CustomObj)marker.getTag(); 
     //Your click handle event 
     // Pass the obj to another activity and you are done 
     return false; 
    } 
}); 
Các vấn đề liên quan