2016-03-02 48 views

回答

1

雖然getCurrentPlace確實帶有一個過濾器參數,但過濾器非常受限制 - 它只允許按現在打開的業務過濾或通過特定的位置ID進行過濾(如果要按預定義位置列表進行過濾)。在一個糟糕的設計中,這個類是最終的,所以你不能擴展它。您必須在調用其API後進行篩選。這是一個有點浪費的記憶智慧,但沒有避免它。

以下代碼按類型過濾PlaceLikelihoodBuffer。它允許您指定多個允許的類型和不允許的類型。禁止優先於允許 - 例如,如果您指定允許爲餐廳並且不允許爲雜貨店,則會拒絕雜貨店中的任何咖啡館。

package com.gabesechan.android.reusable.location; 
import com.google.android.gms.location.places.Place; 
import com.google.android.gms.location.places.PlaceLikelihood; 
import com.google.android.gms.location.places.PlaceLikelihoodBuffer; 

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

public class PlaceTypeFilter { 

    private Set<Integer> mAllowedTypes; 
    private Set<Integer> mDisallowedTypes; 

    public PlaceTypeFilter(int allowedTypes[], int disallowedTypes[]) { 
     mAllowedTypes = new HashSet<>(); 
     for(int type : allowedTypes) { 
      mAllowedTypes.add(type); 
     } 
     mDisallowedTypes = new HashSet<>(); 
     for(int type : disallowedTypes) { 
      mDisallowedTypes.add(type); 
     } 
    } 

    public boolean hasMatchingType(Place place) { 
     List<Integer> types = place.getPlaceTypes(); 
     for (int type : types) { 
      if (mDisallowedTypes.contains(type)) { 
       return false; 
      } 
     } 
     for (int type : types) { 
      if (mAllowedTypes.contains(type)) { 
       return true; 
      } 
     } 
     return false; 
    } 

    public List<PlaceLikelihood> filteredPlaces(PlaceLikelihoodBuffer places) { 
     List<PlaceLikelihood> results = new ArrayList<>(); 
     for(PlaceLikelihood likelihood : places) { 
      if(hasMatchingType(likelihood.getPlace())) { 
       results.add(likelihood); 
      } 
     } 
     return results; 
    } 

}