如何在执行搜索建议时获取DiscoveryResult的位置?

时间:2016-03-07 21:36:46

标签: here-api

我使用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属性。缺点是我需要每次都要求获取位置。在没有向服务器发出请求的情况下获取该位置的任何建议?

提前致谢。

1 个答案:

答案 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()来将结果放在地图上或计算路径。