Android百度地图开发学习笔记(四)之POI检索并显示在listview中

最近在学习扫一扫和集成支付宝,后期会写一写自己的技巧和心得。先来写一写自己的POI检索吧,虽然官方有自己的demo可以直接移植,不过我的poi检索不想这样,所以自己一点一点的去高仿的。

效果图如下:


输入后会有加载的效果,这里用到了ProgressBar,我用的是progressBar4。


搜索后结果会显示在我自定义的listview上


最后是在我的MapActivity上显示所有匹配的结果。

一 POI检索


1.官方技术文档

 点击POI检索技术文档,查看后会发现检索包括:城市内检索、周边检索和区域检索(即矩形范围检索)。

2.个人开发过程

poi检索和poi热词建议检索,我用的是poi检索,刚开始我使用的是poi检索,热词检索我移植了官方demo中的,可以使用。在这里我只写我写的poi检索效果。
(1)创建POI检索实例
 mPoiSearch = PoiSearch.newInstance();  
(2)创建POI检索监听者
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){  

    public void onGetPoiResult(PoiResult result){  
    //获取POI检索结果  
    }  

    public void onGetPoiDetailResult(PoiDetailResult result){  
    //获取Place详情页检索结果  
    }  
};
(3)设置POI检索监听者
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
(4)发起检索请求

mPoiSearch.searchInCity((new PoiCitySearchOption())  
    .city(“北京”)  
    .keyword(“美食”)  
    .pageNum(10));
(5)释放POI检索实例
mPoiSearch.destroy();
调用POI过程是这样的,那么如何实现将显示结果显示自定义在listview中呢!首先我们需要设置 item的样式,将每条内容添加到对应位置就可以。关于自定义listview的使用自行百度一下吧。
写一下如何将POI内容添加并显示出来:
(1)首先我们在onGetPoiResult中将获得的结果提取出来,并创建数据list,最后通过MyAdapter适配器显示出来。
通过代码解释一下具体位置
 public void onGetPoiResult(PoiResult result) {  
    	 // 获取POI检索结果  
        if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {  
          Toast.makeText(PoiActivity.this, "未找到结果", Toast.LENGTH_LONG).show();  
          return;  
        }  
        if (result.error == SearchResult.ERRORNO.NO_ERROR) {  
          List<PoiInfo> allPoi = result.getAllPoi();  
          totalpages = result.getTotalPageNum();  
    
          datas = new String[10];  //搜索结果这里我们先设置只显示10条
          for (int i = 0; i < 10; i++) {  
            datas[i] = allPoi.get(i).name;   	  //获取的所有poi相关名字
            city[i] = allPoi.get(i).city;        //对应的城市
            address[i] = allPoi.get(i).address;  //对应的详细地址
            poi_latlng[i]=allPoi.get(i).location; //对应的位置的经纬度
            
         }  
          mData = getData();//将获得内容list
          
          adapter = new MyAdapter(this);//添加适配器
  		  poi_listView.setAdapter(adapter);
  		     
          return;  
        }  
        if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {  
    
          // 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表  
          String strInfo = "在";  
          for (CityInfo cityInfo : result.getSuggestCityList()) {  
            strInfo += cityInfo.city;  
            strInfo += ",";  
          }  
          strInfo += "找到结果";  
          Toast.makeText(PoiActivity.this, strInfo, Toast.LENGTH_LONG).show();  
        }  
    
    }

  	private List<Map<String, Object>> getData() {
  	List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
  	for(int i=0;i<datas.length;i++)
  	{
  		Map<String, Object> map = new HashMap<String, Object>();
  		map.put("poi_name", datas[i]);
  		map.put("poi_city", city[i]);
  		map.put("poi_address", address[i]);
  		map.put("poi_latlng", poi_latlng[i]);
  		list.add(map);
  		}
  		return list;
  	}

  	public class MyAdapter extends BaseAdapter {


        	private LayoutInflater mInflater;

  		public MyAdapter(Context context) {
  			this.mInflater = LayoutInflater.from(context);
  		}

  		@Override
  		public int getCount() {
  			return mData.size();
  		}


  		@Override
  		public Object getItem(int position) {
  			return null;
  		}


  		@Override
  		public long getItemId(int position) {	
  			return 0;
  		}
  		@Override
  		public View getView(final int position, View convertView, ViewGroup parent) {
  			 ViewHolder holder = null;
  			if (convertView == null) {
  				
  				holder=new ViewHolder();  
  							
  				convertView = mInflater.inflate(R.layout.poi_vlist, null);
  				holder.poi_name = (TextView)convertView.findViewById(R.id.poi_name);
  				//holder.LinearLayout_poi=(LinearLayout) findViewById(R.id.LinearLayout_poi);
  				//holder.info = (TextView)convertView.findViewById(R.id.info);
  				
  				convertView.setTag(holder);				
  			}else {				
  				holder = (ViewHolder)convertView.getTag();
  			}		
  			myApp.setpoiLatLng((LatLng)mData.get(position).get("poi_latlng"));
  			holder.poi_name.setText((String)mData.get(position).get("poi_name")+"\n"+(String)mData.get(position).get("poi_address"));
  			holder.poi_name.setTag(position);
  			holder.poi_name.setOnClickListener(new View.OnClickListener() {
  				
  				@Override
  				public void onClick(View v) {
  						
  						Intent intent=new Intent(PoiActivity.this,MapActivity.class);
  						Bundle bundle = new Bundle();
		            	bundle.putString("tag_poi", "true");
		            	bundle.putString("poi_city", (String)mData.get(position).get("city"));
		            	bundle.putString("poi_address", (String)mData.get(position).get("address"));
		            	intent.putExtras(bundle);
  						startActivity(intent);
  									
  				}
  			});
  			
  			//holder.LinearLayout_poi.setOnClickListener(MyListener(position));
  					
  			return convertView;
  		}
  		
  	}

  	public final class ViewHolder {
  		public TextView poi_name;
  		public TextView info;
  		private LinearLayout LinearLayout_poi;//定义相信信息框的布局
  		
  	}
 说明一下代码涉及listview内部控件点击事件的程序。满足点击后跳转将需要的信息在主Mapactivity调用并显示。
(2)每一次在EditText输入后出现加载图标的显示,讲解一下实现方法。
学习一下如何判定EditText是否输入完成的程序
private void set_eSearch_TextChanged()
    {
        search_key = (EditText) findViewById(R.id.searchkey);
             
        search_key.addTextChangedListener(new TextWatcher() {
                 
             @Override
             public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                   // TODO Auto-generated method stub
                   //这个应该是在改变的时候会做的动作吧,具体还没用到过。
             }
                 
             @Override
             public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                            int arg3) {
                   // TODO Auto-generated method stub
                   //这是文本框改变之前会执行的动作
             }
                 
             @Override
             public void afterTextChanged(Editable s) {
                   // TODO Auto-generated method stub
                   /**这是文本框改变之后 会执行的动作
                     * 因为我们要做的就是,在文本框改变的同时,我们的listview的数据也进行相应的变动,并且如一的显示在界面上。
                     * 所以这里我们就需要加上数据的修改的动作了。
                     */
                   if(s.length() == 0){
                      //   ivDeleteText.setVisibility(View.GONE);//当文本框为空时,则叉叉消失
                	   
                   }
                   else {
                       //  ivDeleteText.setVisibility(View.VISIBLE);//当文本框不为空时,出现叉叉
                     //    myhandler.post(eChanged);
                	   
                	   bar.setVisibility(View.VISIBLE);//加载显示
                	   Handler h = new Handler();
                       h.postDelayed(new Runnable() {
                           
                           @Override
                           public void run() {
                        	   //EditText editCity = (EditText) findViewById(R.id.city);// 输入的城市  
                        	   EditText editSearchKey = (EditText) findViewById(R.id.searchkey);// 输入的关键词  
                        	    // 发起检索请求  
                        	   mPoiSearch.searchInCity((new PoiCitySearchOption())  
                        	            .city("北京")// 根据城市  
                        	            .keyword(editSearchKey.getText().toString())// 根据关键字  
                        	            .pageNum(load_Index));// 查询的页数  
                        	   bar.setVisibility(View.GONE);//加载隐藏
                        	   
                           }
                       }, 2000);
                   }
             }
        });
             
    }

 很简单直接移植就好,在来说明一下使用post方法发送Runnable对象,通过将耗时的操作调用在子线程中,从而实现调用Handler来将更新UI的操作从子线程切换到主线程中执行。

我的layout布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:background="#F0F3F6" >

    <LinearLayout
         style="@style/top_layout"
         android:layout_width="match_parent"
         android:layout_height="80dp"
         android:background="@color/white" 
         android:gravity="center">
          <ImageView
            android:id="@+id/iv_poiback"
            android:layout_width="15dip"
            android:layout_height="15dip"
            android:src="@drawable/setting_arrowpoi" />

       <LinearLayout
           style="@style/top_layout"
           android:layout_marginLeft="10dp"
           android:layout_width="match_parent"
           android:background="@color/lavender"
           android:gravity="center" >
        <ImageView
            android:layout_width="15dip"
            android:layout_height="15dip"
            android:src="@drawable/common_icon_searchbox_magnifier" />

          <EditText 
            android:id="@+id/searchkey"  
            android:layout_marginLeft="2dp"
            android:layout_width="220dp"
            android:layout_height="wrap_content"
            android:layout_weight="0.80"
            android:completionThreshold="2" 
            android:hint="请输入您的目的地"
            android:background="@null"
            android:textSize="15sp" />

          <ProgressBar
              android:id="@+id/progressBar4"
              android:visibility="gone"
              style="?android:attr/progressBarStyle"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_marginLeft="-50dp"
              android:layout_centerInParent="true" />
   
         </LinearLayout>
       
      </LinearLayout>

 	 <ListView
        android:id="@+id/poi_listView"
        android:layout_width="fill_parent"
        android:layout_height="340dp"
        android:layout_weight="0.50"
        android:divider="@drawable/list_line"
        android:dividerHeight="1dip" />
            
</LinearLayout>

3.总结

我只写我的开发思路,程序还是自己去添加。这里只写一个activity的POI检索,关于实现展示在地图上的相关内容,你只需要将对应的位置经纬度信息传到你的Mapactivity中就可以,方法类似。
源码我有时间整理后再上传!










 


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值