我可以同时向ArrayList和HashMap添加标记吗?

时间:2016-05-09 11:28:01

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

我的代码完全符合我的要求。我的意思是我有一个显示5个标记类别的地图片段,我可以按类别过滤它们,一切正常。正如您可能观察到标记1,标记8将出现在多个类别中。这是代码,然后我将继续我的问题:

        Boolean mSetCameraPosition;
        Boolean checkBox1Checked, checkBox2Checked, checkBox3Checked,     checkBox4Checked, checkBox5Checked;
        private int mapTypeSelected;
        CheckBox cbAllDay, cbBefore12, cbBetween1216, cbBetween1620, ccbAfter20;
        AlertDialog dialog;
        List<Marker> firstCategoryList = new ArrayList<>();
        List<Marker> secondCategoryList = new ArrayList<>();
        List<Marker> thirdCategoryList = new ArrayList<>();
        List<Marker> fourthCategoryList = new ArrayList<>();
        List<Marker> fifthCategoryList = new ArrayList<>();


 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            checkLocationPermission();
        }


        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);


        if (savedInstanceState == null) {
            mapTypeSelected = GoogleMap.MAP_TYPE_NORMAL;
            mSetCameraPosition = true;

        } else {
            mapTypeSelected = savedInstanceState.getInt("the_map_type", GoogleMap.MAP_TYPE_NORMAL);
            mSetCameraPosition = false;



  @Override
    public void onMapReady(GoogleMap googleMap) {

        mMap = googleMap;
        if (mSetCameraPosition) {
            initialLocation(TOULOUSE_LAT, TOULOUSE_LNG, 12);

        }
        mMap.setMapType(mapTypeSelected);

 if (initialMarkers) {
            addMarkers2Map();
        }

  public void addMarkers2Map() {

        // Markers location

        LatLng marker1 = new LatLng(43.607044, 1.450307);
        LatLng marker2= new LatLng(43.571505, 1.417759);
        LatLng marker3= new LatLng(43.607469, 1.447162);
        LatLng marker4= new LatLng(43.600723, 1.455917);
        LatLng marker5= new LatLng(43.604892, 1.476562);
        LatLng marker6= new LatLng(43.604496, 1.474924);
        LatLng marker7= new LatLng(43.604781, 1.474502);

        // Markers All day long
        firstCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker1).title("First Place ").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 8.30 - 22.30")));

        // Markers Before 12 PM
        secondCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker2).title("Second Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 10.30 - 11.30")));

        // Markers Between 12-16
        thirdCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker3).title("Third Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 15.30 - 16.30")));
        thirdCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker4).title("Fourth Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 15.00 - 16.00")));

        // Markers Between 16-20
        fourthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker5).title("Fifth Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 15.30 - 16.30")));
        fourthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker6).title("Sixth Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 16.30 - 17.30")));
        fourthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker7).title("Seventh Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 18.30 - 19.30")));
        fourthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker8).title("Eighth Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 17.30 - 18.30\nHH:21.30 - 22.30")));


        // Markers After 20
        fifthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker8).title("Eighth Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 17.30 - 18.30\nHH:21.30 - 22.30")));
        fifthCategoryList.add(mMap.addMarker(new MarkerOptions().position(marker1).title("First Place").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 8.30 - 22.30")));


  public void filterTheMarkers(View view) {


        if (dialog == null){
        AlertDialog.Builder builder;
        builder = new AlertDialog.Builder(this);
        LayoutInflater inflater = this.getLayoutInflater();
        @SuppressLint("InflateParams") View checkBoxView = inflater.inflate(R.layout.markers_filtering, null);
        builder.setView(checkBoxView);
        cbAllDay = (CheckBox) checkBoxView.findViewById(R.id.checkBox1);
        if (checkBox1Checked != null) {
            cbAllDay.setChecked(checkBox1Checked);

        }
        cbBefore12 = (CheckBox) checkBoxView.findViewById(R.id.checkBox2);
        if (checkBox2Checked != null) {
            cbBefore12.setChecked(checkBox2Checked);

        }
        cbBetween1216 = (CheckBox) checkBoxView.findViewById(R.id.checkBox3);
        if (checkBox3Checked != null) {
            cbBetween1216.setChecked(checkBox3Checked);

        }
        cbBetween1620 = (CheckBox) checkBoxView.findViewById(R.id.checkBox4);
        if (checkBox4Checked != null) {
            cbBetween1620.setChecked(checkBox4Checked);

        }
        ccbAfter20 = (CheckBox) checkBoxView.findViewById(R.id.checkBox5);
        if (checkBox5Checked != null) {
            ccbAfter20.setChecked(checkBox5Checked);

        }

        dialog = builder.create();


    }

        dialog.show();
    }

  public void displaySelectedMarkers(View view) {

        dialog.dismiss();
        Log.i("TAG", "All Day " + cbAllDay.isChecked() + " Before 12 " + cbBefore12.isChecked() + " Between 12-16 " + cbBetween1216.isChecked() + " Between 16-20" + cbBetween1620.isChecked() + " After 20 " + ccbAfter20.isChecked());
        //according these check boxes status execute your code to show/hide markers


        if (cbAllDay.isChecked() && cbBefore12.isChecked() && cbBetween1216.isChecked() && cbBetween1620.isChecked() && ccbAfter20.isChecked()) {
            // show all markers
            for (Marker marker : firstCategoryList) {
                marker.setVisible(true);
            }
            for (Marker marker : secondCategoryList) {
                marker.setVisible(true);
            }
            for (Marker marker : thirdCategoryList) {
                marker.setVisible(true);
            }
            for (Marker marker : fourthCategoryList) {
                marker.setVisible(true);
            }
            for (Marker marker : fifthCategoryList) {
                marker.setVisible(true);
            }
        } else if (cbAllDay.isChecked() && !cbBefore12.isChecked() && !cbBetween1216.isChecked() && !cbBetween1620.isChecked() && !ccbAfter20.isChecked()) {
            // show only All Day Markers
            for (Marker marker : firstCategoryList) {
                marker.setVisible(true);
            }
            for (Marker marker : secondCategoryList) {
                marker.setVisible(false);
            }
            for (Marker marker : thirdCategoryList) {
                marker.setVisible(false);
            }
            for (Marker marker : fourthCategoryList) {
                marker.setVisible(false);
            }
            for (Marker marker : fifthCategoryList) {
                marker.setVisible(false);
            }
        }
//....and it goes like this for a while until I finish all the possibilities

现在我要做的是为每个点击的标记信息窗口打开一个新活动,这样我找到的解决方案是将所有标记添加到HashMap并为每个标记命名,以便我可以将其添加到HashMap和ArrayList,如下所示:

private Map<Marker, Class> allMarkersMap = new HashMap<>();
Marker markerMarker1 = mMap.addMarker(new MarkerOptions().position(marker1).title("BAR ACASA").icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker)).snippet("HH: 8.30 - 22.30"));

firstCategoryList.add(markerMarker1);
allMarkersMap.put(markerMarker1, Marker1.class);

现在onMapReady我正在添加这个代码,我为每个标记Marker1.java创建一个类,Marker2.java .......

mMap.setOnInfoWindowClickListener(MyOnInfoWindowClickListener);
GoogleMap.OnInfoWindowClickListener MyOnInfoWindowClickListener = new GoogleMap.OnInfoWindowClickListener() {
    @Override
    public void onInfoWindowClick(Marker marker) {
        Class cls = allMarkersMap.get(marker);
        Intent intent = new Intent(MainActivity.this, cls );
        startActivity(intent);
    }
};

对于仅出现在一个类别中的标记,一切正常,但对于多个类别中的标记,过滤器不再起作用,仅显示最后添加到HashMap的标记(希望您了解什么我在这里说)。

那么,我可以这样做,仍然有我的过滤器功能吗?正如我想象的那样,事实是,一旦我定义了一个标记并将它放在Arraylist中,它就会将标记移动到那里,然后当我把它放在HashMap中时,它再次移动到HashMap,所以当我过滤arraylists标记不再在列表中...
什么是我的信息窗口为每个显示的标记打开不同活动的最佳解决方案?

1 个答案:

答案 0 :(得分:1)

我不会为我的解决方案编写很多代码,因为我认为编写它会更好,我认为它背后的想法比代码本身更重要。

首先,一个小建议,无论何时开始开发显示信息的UI内容,都会尝试查找通用描述或描述将要显示的信息的规则。当您找到规则/描述时,这意味着您找到了ports类。 我强烈建议您使用自己创建的自定义类来保存UI所需的信息。

现在回到你的例子,根据我的理解,你有标记将被添加到一个类别,并根据你在地图上显示它们的类别。 我会做什么,我会创建一个自定义类,称为image,其成员modelMyAwesomeMarker

这样的事情:

Marker

然后在您的主要课程中,我会有一个ArrayList<String> category列表,让我们称之为public class MyAwesomeMarker { private Marker mMarker; private List<String> mMarkerCategories; // here you can mark if a marker is in more than one categories. // constructors public MyAwesomeMarker(Marker marker, String category) { mMarker = marker; mMarkerCategories = new ArrayList<String>(); mMarkerCategories.add(category); } public void addNewCategory(String category) { if(category != null && !mMarkerCategorie.contains(category)) { mMarkerCategories.add(category); } } public void toggleMarkerIfHasCategory(String theCategory) { for(String category : mMarkerCategories) { if(category.equals(theCategory) { marker.setVisible(true); } else { marker.setVisible(false); } } } // setters getters }

现在,您要显示名为MyAwesomeMarker的类别中的所有标记。

myMarkers

现在你唯一需要做的就是生成点燃的自定义标记,然后你就完成了。