android地图显示多个标记(来自sqlite的LatLng)

时间:2017-06-26 20:33:53

标签: android sqlite google-maps-markers android-maps

我在我的Android应用中使用google地图和get(用户)设备位置(GPS位置),并插入数据库(SQLite)经纬度和地址!

现在我想显示从数据库中读取LatLng的多个位置...在创建标记中没有问题,但在标记信息(国家,城市......)中仅显示所有标记的最后插入位置!

这是我的代码:

private void displayMultiplePoint() {
        if (LOCATION_TABLE.size() > 0) {
            for (int i = 0; LOCATION_TABLE.size() > i; i++) {
                int id = LOCATION_TABLE.get(i).getId();
                lat = LOCATION_TABLE.get(i).getLatitude();
                lng = LOCATION_TABLE.get(i).getLongitude();
                place = LOCATION_TABLE.get(i).getPlace();
                rate = LOCATION_TABLE.get(i).getRate();
                drawMarker(new LatLng(lat, lng), "city", place, rate);
                displayToast(id + "" + place);
            }
        }
    }

    private void drawMarker(final LatLng point, final String city, final String place, final float rate) {
        mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            @Override
            public View getInfoWindow(Marker arg0) {
                return null;
            }

            @Override
            public View getInfoContents(Marker arg0) {
                View v = null;
                try {
                    v = getLayoutInflater().inflate(R.layout.custom_info_contents, null);
                    ImageView map_image = (ImageView) v.findViewById(R.id.maps_image);
                    map_image.setImageResource(R.drawable.runhd);
                    TextView city_txt = (TextView) v.findViewById(R.id.maps_city);
                    city_txt.setText(city);
                    TextView place_txt = (TextView) v.findViewById(R.id.maps_place);
                    place_txt.setText(place);
                    RatingBar rate_bar = (RatingBar) v.findViewById(R.id.exercise_display_rate);
                    rate_bar.setRating(rate);
                } catch (Exception ev) {
                    System.out.print(ev.getMessage());
                }
                return v;
            }
        });
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(point);
        mMap.addMarker(markerOptions);
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(point, 6));
    }

我在数据库中显示来自lcation表的吐司形式rowId,并显示3行id:1,2,3,但在标记信息中显示最后一个id(id no:3)

这是我的片段:

enter image description here

感谢' S

3 个答案:

答案 0 :(得分:1)

我为你的案子提供了很多解决方案但是起初:

你使用setInfoWindowAdapter方法摔倒只是一次调用,所以在你迭代数据库项目并通过drawMarker传递信息之后,它只是显示了最后一次修改(保存)来自变量的数据,所以我建议在你的for循环中移动它(我知道它不是一个完美的解决方案):

 for (int i = 0; LOCATION_TABLE.size() > i; i++) {
            int id = LOCATION_TABLE.get(i).getId();
            lat = LOCATION_TABLE.get(i).getLatitude();
            lng = LOCATION_TABLE.get(i).getLongitude();
            place = LOCATION_TABLE.get(i).getPlace();
            rate = LOCATION_TABLE.get(i).getRate();
            drawMarker(new LatLng(lat, lng), "city", place, rate);
            displayToast(id + "" + place);
            ..........
             @Override
        public View getInfoContents(Marker arg0) {
            View v = null;
            try {
                v = getLayoutInflater().inflate(R.layout.custom_info_contents, null);
                ImageView map_image = (ImageView) v.findViewById(R.id.maps_image);
                map_image.setImageResource(R.drawable.runhd);
                TextView city_txt = (TextView) v.findViewById(R.id.maps_city);
                city_txt.setText("city");
                TextView place_txt = (TextView) v.findViewById(R.id.maps_place);
                place_txt.setText(place);
                RatingBar rate_bar = (RatingBar) v.findViewById(R.id.exercise_display_rate);
                rate_bar.setRating(rate);
            } catch (Exception ev) {
                System.out.print(ev.getMessage());
            }
            return v;
            ......
        }

第二个解决方案在您的数据库中使用Cursor并在任何地方使用它(这将是非常棒的)。

第3次Clustering中使用google_maps-utils-example算法。

答案 1 :(得分:1)

信息窗口仅显示最后一个标记,因为setInfoWindowAdapter()设置了整个地图的信息窗口。在setInfoWindowAdapter()内,您需要将标记参数与相应的数据相关联。

  1. 您需要维护数据地图的标记。

    Map<Marker, Place> markerToPlaceMap = new HashMap<>();
    

    其中,Place是一个用于保存城市,地点和评级的类。

    class Place {
        public String city, place;
        public float rating;
    }
    

    注意:请将成员更改为私有,并根据您的适用性实施getter和setter。

  2. 接下来,您的drawMarker()将更改如下。它需要将marker及其相关place添加到markerToPlace地图。

    private void drawMarker(final LatLng point, final String city, final String place, final float rate) {
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(point);
        Marker marker = mMap.addMarker(markerOptions);
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(point, 6));
        markerToPlaceMap.put(marker, new Place(city, place, rating));
    }
    
  3. 最后,您将覆盖GoogleMap.setInfoWindowAdapter()并访问与Place相关的marker,以设置相应的信息内容。

    mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
    
        @Override
        public View getInfoWindow(Marker marker) {
            return null;
        }
    
        @Override
        public View getInfoContents(Marker marker) {
            View v = null;
            try {
    
                v = getLayoutInflater().inflate(R.layout.custom_info_contents, null);
    
                ImageView map_image = (ImageView) v.findViewById(R.id.maps_image);
                map_image.setImageResource(R.drawable.runhd);
    
                TextView city_txt = (TextView) v.findViewById(R.id.maps_city);
                city_txt.setText(markerToPlace.get(marker).city); // <- Check how corresponding place for a marker is fetched and used
    
                TextView place_txt = (TextView) v.findViewById(R.id.maps_place);
                place_txt.setText(markerToPlace.get(marker).place);
    
                RatingBar rate_bar = (RatingBar) v.findViewById(R.id.exercise_display_rate);
                rate_bar.setRating(markerToPlace.get(marker).rate);
    
            } catch (Exception ev) {
                System.out.print(ev.getMessage());
            }
            return v;
        }
    });
    

答案 2 :(得分:0)

我在数据库中使用光标并获取数据行(并在Toast中显示) 但 我的代码改为:

private void displayMultiplePoint() {
        Cursor cursor = DB_HELPER.LOCATION_MARKERS();
        if (cursor.moveToFirst()) {
            for (int i = 0; cursor.getCount() > i; i++) {
                int id = cursor.getInt(cursor.getColumnIndex("id"));
                double lat = cursor.getDouble(cursor.getColumnIndex("latitude"));
                double lng = cursor.getDouble(cursor.getColumnIndex("longitude"));
                String place = cursor.getString(cursor.getColumnIndex("place"));
                float rate = cursor.getFloat(cursor.getColumnIndex("rate"));
                displayToast(id + ", " + place + rate);
                cursor.moveToNext();
                drawMarker(new LatLng(lat, lng));
            }
            cursor.close();
        }
    }

我得到arg0.getId形式:(m0,m1,m2 ......)

public View getInfoContents(Marker arg0)

(每个标记都是唯一的)然后按id选择数据,其中id = arg0