最近在学习扫一扫和集成支付宝,后期会写一写自己的技巧和心得。先来写一写自己的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中就可以,方法类似。
源码我有时间整理后再上传!