当我们我们输入关键词“ktv”进行搜索,而在代码中我们设置了搜索城市为“北京”,即我们要搜索北京市所有的KTV。搜索完成后,可以看到搜索到的ktv所在位置也在地图上进行了标注。
到目前为止,一切看起来很正常。然而,真的是这样吗?请仔细看上面第一张图中显示的搜索结果数为60,即在北京市总共个60家ktv,但是下面却只显示了10家ktv名称,并且第二张图中地图中也只标注了10家ktv,这到底是为什么呢?其它50家ktv结果去哪了?原因是这样的:
一次搜索所得到的POI数有时候可能有成千上万个,比如你搜索“餐厅”试试,试想如果一次性从百度地图服务器上返回上万条搜索结果数据到客户的手机上将会是一种什么样的情况?所以百度地图API对一次性返回的搜索结果进行了限制–一次性最多只能返回50条搜索结果,默认情况下一次性返回10条搜索结果。我们可以通过下面的方法去改变一次性返回的搜索结果数:
// 设置每页返回的POI数,默认为10,取值范围1-50
MKSearch.setPoiPageCapacity(10);
但最大也只能设置为50。那么怎么才能一次性得到所有的搜索结果呢?怎么才能得到上面示例中的60家ktv的信息呢?让我们来改一下上面Activity中处理搜索结果的方法onGetPoiResult,其实所有代码都保持不变。将onGetPoiResult方法内的处理代码修改为:
- /**
- * POI搜索结果(范围检索、城市POI检索、周边检索)
- *
- * @param result 搜索结果
- * @param type 返回结果类型(11,12,21:poi列表 7:城市列表)
- * @param iError 错误号(0表示正确返回)
- */
- @Override
- public void onGetPoiResult(MKPoiResult result, int type, int iError) {
- if (result == null) {
- return;
- }
- // 清除地图上已有的所有覆盖物
- mapView.getOverlays().clear();
- // PoiOverlay是baidu map api提供的用于显示POI的Overlay
- PoiOverlay poioverlay = new PoiOverlay(PoiSearchInCityActivity.this, mapView);
- // 设置搜索到的POI数据
- poioverlay.setData(result.getAllPoi());
- // 在地图上显示PoiOverlay(将搜索到的兴趣点标注在地图上)
- mapView.getOverlays().add(poioverlay);
- // 如果当前页的索引为0,表示第一页搜索结果
- if(result.getPageIndex() == 0) {
- sb.append("共搜索到").append(result.getNumPois()).append("个POI/n");
- }
- // 遍历当前页返回的POI(默认只返回10个)
- for (MKPoiInfo poiInfo : result.getAllPoi()) {
- sb.append("名称:").append(poiInfo.name).append("/n");
- }
- if(result.getPageIndex() < result.getNumPages()-1) {
- mMKSearch.goToPoiPage(result.getPageIndex() + 1);
- }
- // 如果是最后一页,显示搜索结果
- else if(result.getPageIndex() == result.getNumPages()-1) {
- // 设置其中一个搜索结果所在地理坐标为地图的中心
- MKPoiInfo poiInfo = result.getPoi(0);
- mapController.setCenter(poiInfo.pt);
- // 通过AlertDialog显示所有搜索到的POI
- new AlertDialog.Builder(PoiSearchInCityActivity.this)
- .setTitle("搜索到的POI信息")
- .setMessage(sb.toString())
- .setPositiveButton("关闭", new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- dialog.dismiss();
- }
- }).create().show();
- }
- }
运行结果图:
怎么样?搜索到的60家ktv信息一次性全部显示出来了吧。关键在于下面这3行代码:
- if(result.getPageIndex() < result.getNumPages()-1) {
- mMKSearch.goToPoiPage(result.getPageIndex() + 1);
- }
服务器是以分页的形式分多次向我们返回搜索结果的,result.getPageIndex()得到的是当前页码(从0开始)。这3行代码的含义是:如果当前页不是最后一页,那么就转到下一页(goToPoiPage方法是作用是跳转到搜索结果的第几页),每次调用goToPoiPage方法,都会再次触发搜索请求,也就会再次回调执行onGetPoiResult方法;这和网页中的服务器端分页是一个道理,即每次点击“上一页”、“下一页”都会再一次提交查询请求。这也就是为什么我们要采用static类型的StringBuilder对象来保存搜索结果而不是在onGetPoiResult方法中定义一个局部变量,并且还要在每次点击“搜索”按钮后,重新创建一个新的StringBuilder对象来存储搜索结果。