我使用android SDK实现了搜索建议,代码如下所示:
private void performSearch(CharSequence searchTerm) {
try {
DiscoveryRequest request = new SearchRequest( searchTerm.toString())
.setSearchCenter( mMap.getCenter() )
.setCollectionSize( 10 );
ErrorCode error = request.execute( mSearchRequestListener );
if ( error != ErrorCode.NONE ) {
Log.i( TAG, "Here API place search error: " + error.name() );
mSearchAdapter.notifyDataSetInvalidated();
}
} catch ( IllegalArgumentException ex ) {
Log.i( TAG, "Here API place search exception: " +
ex.getMessage() != null ? ex.getMessage() : "" );
mSearchAdapter.notifyDataSetInvalidated();
}
}
private ResultListener<DiscoveryResultPage> mSearchRequestListener =
new ResultListener<DiscoveryResultPage>() {
@Override
public void onCompleted(DiscoveryResultPage data, ErrorCode error) {
if ( error != ErrorCode.NONE ) {
Log.i( TAG, "Here API place search error: " + error.name() );
mSearchAdapter.notifyDataSetInvalidated();
return;
}
Log.d(TAG, "mSearchRequestListener.onCompleted: count=" + data.getItems().size() );
mResultList = new ArrayList<DiscoveryResult>( data.getItems());
String vicinity = mResultList.get(0).getVicinity();
//String location = ?
mSearchAdapter.notifyDataSetChanged();
}
};
获取DiscoveryResult列表后,如何获取DiscoveryResult的位置?看来我在DiscoveryResult对象中找不到这个属性。我需要将此位置添加到我的RoutePlan以计算路线。
RoutePlan routePlan = new RoutePlan();
routePlan.addWaypoint(currentGeoCoordinate);
routePlan.addWaypoint(destGeoCoordinate);
routeManager.calculateRoute( routePlan, mRouteManagerListener );
我的代码中有一个解决方法。在我到达附近后,我在http://geocoder.cit.api.here.com/6.2/geocode.json?searchtext=&#34; +附近+&#34; gen = 9&#34 ;;得到回应。响应此请求时有一个Location属性。缺点是我需要每次都要求获取位置。在没有向服务器发出请求的情况下获取该位置的任何建议?
提前致谢。
答案 0 :(得分:1)
DiscoveryResultPage中的数据可以是多种类型,您应该选择正确的类型。
请参阅此处的文档: https://developer.here.com/mobile-sdks/documentation/android-hybrid-plus/topics/places.html
重要的部分:
调用DiscoveryResultPage.getItems(),返回包含一个的List 以下类型的对象,即DiscoveryResult 实例。 DiscoveryResult是Link子类型的集合。
PlaceLink - 表示有关场所的发现信息。该 PlaceLink包含有关某个地方的简短摘要。有关的详细信息 地方可从PlaceLink引用的地方获得。 DiscoveryLink - 表示用于的与发现相关的API链接 检索其他DiscoveryResultPage。这种类型的链接可以是 “探索”或“此处”搜索类型中的结果项。 DiscoveryLink 引用精炼的发现请求,使其更具体 结果。例如,DiscoveryLink可以链接到发现 要求搜索'Eat&amp;喝酒,'走出去','住宿',和 等等。由于将来可能会有新类型的链接项目,因此 建议在每种类型的DiscoveryResult之前进行检查 使用(如下面的代码片段所示)。
这实际上意味着你迭代数据并检查这样的类型:
public class Fragment_two extends android.support.v4.app.Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_two, container, false);
return v;
}
}
或仅直接获取PlaceLink项目:
// Implement a search result listener
ResultListener<DiscoveryResultPage> searchListener = new ResultListener<DiscoveryResultPage>() {
@Override
public void onCompleted(DiscoveryResultPage results, ErrorCode error) {
if (error == ErrorCode.NONE) {
// The results is a DiscoveryResultPage which represents a
// paginated collection of items.
List<DiscoveryResult> items = results.getItems();
// Iterate through the found place items.
for (DiscoveryResult item : items) {
// A Item can either be a PlaceLink (meta information
// about a Place) or a DiscoveryLink (which is a reference
// to another refined search that is related to the
// original search; for example, a search for
// "Leisure & Outdoor").
if (item.getResultType() == ResultType.PLACE) {
PlaceLink placeLink = (PlaceLink) item;
// PlaceLink should be presented to the user, so the link can be
// selected in order to retrieve additional details about a place
// of interest.
...
} else if (item.getResultType() == ResultType.DISCOVERY) {
DiscoveryLink discoveryLink = (DiscoveryLink) item;
// DiscoveryLink can also be presented to the user.
// When a DiscoveryLink is selected, another search request should be
// performed to retrieve results for a specific category.
...
}
}
} else {
// Handle search request error.
}
}
};
然后,PlaceLink对象具有您将使用的所有方法,也可以使用getPosition()或getDistance()来将结果放在地图上或计算路径。