2016-05-09 18 views
0

私はこのコードを、私が望むのとまったく同じように動作させています。私は、5つのマーカーカテゴリを表示するマップフラグメントを持っていることを意味します、私はカテゴリー別にフィルタリングすることができ、すべて正常に動作します。目に見えるように、マーカー1とマーカー8は、複数のカテゴリに表示されます。ここでは、コードがあると私はその後、私の問題を継続していきます。ArrayListとHashMapに同時にマーカーを追加できますか?

 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のにしてArrayListに追加することができますように、すべてのマーカーの名前をHashMapのと与える:

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); 
    } 
}; 

1つのカテゴリにのみ表示されるマーカーはすべて正常に機能しますが、複数のカテゴリにあるマーカーの場合は、フィルタがもう機能しないため、最後にHashMapに追加されたマーカーのみが表示されます。私はここに言っている)。

だから私はこれを行うことができますが、私のフィルタはまだ機能していますか?私が想像していることは、マーカーを定義してそれをArraylistに置くとマーカーがそこに移動し、その後にHashMapに置くと再びHashMapに移動するということですarraylistsマーカーはもうリストには含まれていません...
表示される各マーカーに対して異なる活動を開始する情報ウィンドウの最適なソリューションは何でしょうか?

+0

マーカーをクリックしてアクティビティを同じに保つだけで、パラメータを渡します(マーカーのクリックに応じて異なる)。それが役に立てば幸い。 –

答えて

1

私はあなたがそれを書く方が良いと思うので、私の解決策のために多くのコードを書いてはいけません。その背後にあるアイデアはコードそのものよりも重要だと思います。

最初に、情報を表示するUIの開発を開始するときはいつでも、あなたには小さな提案があります。表示される情報を説明する一般的な説明またはルールを見つけようとします。そのルール/説明を見つけたら、modelクラスが見つかりました。 あなたのUIに必要な情報を保持するカスタムクラスを作成することを強くお勧めします。

あなたの例に戻って、わかっていることから、カテゴリに追加されるマーカーがあり、そのカテゴリに基づいて地図上にマーカーを表示します。 私は、MarkerのメンバーとArrayList<String> categoryを持つMyAwesomeMarkerというカスタムクラスを作成します。このような

何か:

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

それを呼びましょうawesomness

for(MyAwesomeMarker marker : myMarkers) { 
     marker.toggleMarkerIfHasCategory("awesomness"); 
} 

あなたがしなければならないことは、カスタムマーカーの点灯を生成することです。

+0

私は確かにあなたの提案を明日お試しください。私は、コードをそのように書くと、私がやっていることをよりよく理解できるようになると、それが良いという事実に同意します。情報を表示するUIの開発を開始したり、一般的な説明や、表示される情報を記述するルールを見つけようとするときはいつでも、あなたが私にここで教えていることを理解していませんでした。あなたがモデルクラスを見つけたことを意味します。 (一般的な説明やルールを見つけるのはどこですか?私はこれですべてが新しく、もっと詳細な説明をお待ちしております) –

+0

私は「プライベートリスト mMarkerCategories;」の方法もわかりませんifマーカーは複数のカテゴリに分類されます。これは、mMarkerCategoriesという名前の文字列のリストになります。この場合、マーカーのいずれかのカテゴリか、申し訳ありませんが、私はあなたが何を説明しているかを正確に理解していません –

+0

そして、私がやろうとしていることを明確にするために:私はマップ上にいくつかのマーカーを追加しています。このマーカーは常にそこにあります。私はマーカーを5つのカテゴリーに分類します。いくつかのマーカーは、複数のカテゴリーの一部になります。マーカーはカテゴリ別にフィルタリングされ、それに応じて表示されますが、他のマーカーは削除されず、表示されないように設定されます。この方法で、マーカをマップに一度だけ追加し、後でフィルタ処理でマーカを操作したいとします。 –

関連する問題