Android高仿百度地图公交与位置建议搜索(四)
2014-10-26 11:19
453 查看
Android高仿百度地图公交与位置建议搜索
转载请注明:/article/10643535.html
最近自己在开发一个Android的app,由于需要主动搜索位置以及公交信息,所以想先借鉴一下百度地图的位置公交搜索模块,姑且先模仿百度地图来实现。
1、UI布局文件如下:
2、Activity中代码如下:
上文的Activity主要是进行简单的建议搜索,并把搜索的结果显示在ListVIew中,接下来我们看看ListView中的适配器对象,由于在项目中我们会经常用到适配器对象,因此这里把适配器对象写成了一个模板基类,先看看基类适配器对象。
3、适配器基类对象
4、ListView中的适配器对象,代码如下:
5、建议搜索结果如下,分别进行了位置搜索和公交搜索,结果如下:
![](http://img.blog.csdn.net/20141026120543625?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc21pbGU1MDA1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
转载请注明:/article/10643535.html
最近自己在开发一个Android的app,由于需要主动搜索位置以及公交信息,所以想先借鉴一下百度地图的位置公交搜索模块,姑且先模仿百度地图来实现。
1、UI布局文件如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/common_background_color" android:orientation="vertical" > <include android:id="@+id/common_search_action_bar" layout="@layout/baidu_search_action_bar" /> <ListView android:id="@+id/lv_position_list" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>其中Include是自己写的一个共同的搜索模块的View,大家可以根据自己的具体项目来替换。
2、Activity中代码如下:
package com.remind.ui; import java.util.ArrayList; import java.util.List; import com.baidu.mapapi.search.core.CityInfo; import com.baidu.mapapi.search.core.PoiInfo; import com.baidu.mapapi.search.core.PoiInfo.POITYPE; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener; import com.baidu.mapapi.search.poi.PoiDetailResult; import com.baidu.mapapi.search.poi.PoiResult; import com.baidu.mapapi.search.poi.PoiSearch; import com.baidu.mapapi.search.sug.OnGetSuggestionResultListener; import com.baidu.mapapi.search.sug.SuggestionResult; import com.baidu.mapapi.search.sug.SuggestionSearch; import com.baidu.mapapi.search.sug.SuggestionSearchOption; import com.mr.remind.R; import com.remind.adapter.PoiResultAdapter; import com.remind.bean.MrPoiResult; import com.remind.config.Constant; import com.remind.db.AlarmColumn; import com.remind.db.DBHelper; import com.remind.db.PoiHistoryColumn; import com.remind.utils.LogUtils; import com.remind.widget.ClearEditText; import android.app.Activity; import android.database.Cursor; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.widget.ListView; import android.widget.Toast; /** * 搜索细节的Activity; * @author Render */ public class SearchDetailActivity extends Activity implements OnGetSuggestionResultListener{ private static final String TAG = "SearchDetailActivity"; private SuggestionSearch mSuggestionSearch = null; //百度地图建议搜索对象; private ClearEditText mEditText; //自定义的一个Edit控件,也可以用标准的EditView替代. private ListView mListView; private PoiResultAdapter mPoiResultAdapter=null; //自定义的ListView适配器对象。 private List<MrPoiResult> mPoiResults=null; //查询后的结果数据链表;其中MrPoiResult是自定义的Bean对象。 private String mSearchName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_detail); initView(); initData(); } private void initView(){ mEditText=(ClearEditText) findViewById(R.id.et_search); mListView=(ListView) findViewById(R.id.lv_position_list); } private void initData(){ mPoiResults=new ArrayList<MrPoiResult>(); mPoiResultAdapter=new PoiResultAdapter(this, mPoiResults); mListView.setAdapter(mPoiResultAdapter); mSuggestionSearch = SuggestionSearch.newInstance(); mSuggestionSearch.setOnGetSuggestionResultListener(this); mEditText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { mSearchName=mEditText.getText().toString(); excuteSuggestionSearch(); } }); } /** * 开始执行建议搜索; */ private void excuteSuggestionSearch(){ mPoiResults.clear(); //清空链表; if(mSearchName.equals("")||mSearchName==null){ mPoiResultAdapter.updateListView(mPoiResults,null); return; } //根据输入的名称和城市进行建议搜索,建议搜索很强大,即使固定了城市,也可以搜索到别的地方。 mSuggestionSearch .requestSuggestion((new SuggestionSearchOption()) .keyword(mSearchName).city(Constant.city)); } @Override public void onGetSuggestionResult(SuggestionResult res) { if (res == null || res.getAllSuggestions() == null) { return; } for (SuggestionResult.SuggestionInfo info : res.getAllSuggestions()) { if (info.key != null){ MrPoiResult poiResult=new MrPoiResult(); //记录搜索到的城市,名称和地区; poiResult.setCity(info.city); poiResult.setName(info.key); poiResult.setAddress(info.city+info.district); mPoiResults.add(poiResult); } } mPoiResultAdapter.updateListView(mPoiResults,mSearchName); } @Override protected void onDestroy() { mSuggestionSearch.destroy(); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } }
上文的Activity主要是进行简单的建议搜索,并把搜索的结果显示在ListVIew中,接下来我们看看ListView中的适配器对象,由于在项目中我们会经常用到适配器对象,因此这里把适配器对象写成了一个模板基类,先看看基类适配器对象。
3、适配器基类对象
package com.remind.adapter.base; import java.util.LinkedList; import java.util.List; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; public abstract class AdapterBase<T> extends BaseAdapter { private final List<T> mList = new LinkedList<T>(); public List<T> getList(){ return mList; } public void appendToList(List<T> list) { if (list == null) { return; } mList.addAll(list); notifyDataSetChanged(); } public void appendToTopList(List<T> list) { if (list == null) { return; } mList.addAll(0, list); notifyDataSetChanged(); } public void clear() { mList.clear(); notifyDataSetChanged(); } @Override public int getCount() { if(mList!=null){ return mList.size(); } return 0; } @Override public Object getItem(int position) { if(position > mList.size()-1){ return null; } return mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (position == getCount() - 1) { onReachBottom(); } return getExView(position, convertView, parent); } // 两个基类对象,由子类进行扩展; protected abstract View getExView(int position, View convertView, ViewGroup parent); protected abstract void onReachBottom(); }
4、ListView中的适配器对象,代码如下:
package com.remind.adapter; import java.util.List; import android.content.Context; import android.graphics.Color; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.style.ForegroundColorSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import com.mr.remind.R; import com.remind.adapter.base.AdapterBase; import com.remind.bean.MrPoiResult; public class PoiResultAdapter extends AdapterBase<MrPoiResult>{ private Context ct; private ViewHolder viewHolder=null; private String mSearchKey; //搜索的关键字对象; public PoiResultAdapter(Context ct,List<MrPoiResult> postions){ this.ct=ct; appendToList(postions); } public void updateListView(List<MrPoiResult> datas,String searchKey){ mSearchKey=searchKey; clear(); appendToList(datas); notifyDataSetChanged(); } static class ViewHolder { ImageView imageView; TextView tvName; TextView tvAddress; } @Override protected View getExView(int position, View convertView, ViewGroup parent) { MrPoiResult poiResult=getList().get(position); if (convertView == null) { convertView = LayoutInflater.from(ct).inflate(R.layout.item_poi_result, null); viewHolder = new ViewHolder(); viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_postion_icon); viewHolder.tvName=(TextView)convertView.findViewById(R.id.tv_position_name); viewHolder.tvAddress=(TextView)convertView.findViewById(R.id.tv_position_address); convertView.setTag(viewHolder); } else{ viewHolder = (ViewHolder) convertView.getTag(); } //该部分主要是针对于搜索的结果,用不同的颜色标记出和关键字相同的部分。 String name=poiResult.getName(); int nBegIndex=name.indexOf(mSearchKey); int nEndIndex=nBegIndex+mSearchKey.length(); if(nBegIndex!=-1) { //设置指定位置文字的颜色 SpannableStringBuilder style=new SpannableStringBuilder(name); style.setSpan(new ForegroundColorSpan(Color.rgb(118, 173, 255)), nBegIndex,nEndIndex,Spannable.SPAN_EXCLUSIVE_INCLUSIVE); viewHolder.tvName.setText(style); } //下面部分主要是对于如果搜索到的地址为空时,把搜索的名字动态居中显示。 if(poiResult.getAddress()==null||poiResult.getAddress().equals("")){ RelativeLayout.LayoutParams lParams= new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); lParams.addRule(RelativeLayout.CENTER_VERTICAL); viewHolder.tvName.setLayoutParams(lParams); viewHolder.tvAddress.setText(""); }else{ RelativeLayout.LayoutParams lParams= new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); lParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); viewHolder.tvName.setLayoutParams(lParams); viewHolder.tvAddress.setText(poiResult.getAddress()); } return convertView; } @Override protected void onReachBottom() { } }
5、建议搜索结果如下,分别进行了位置搜索和公交搜索,结果如下:
相关文章推荐
- android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索
- android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索
- android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索
- [android] 百度地图开发 (二).定位城市位置和城市POI搜索
- 关于 android百度地图 调用 地理位置 经纬度坐标,只调用一次的解决方法,通知栏不总是 搜索 GPS 。。。
- Android 百度地图 SDK v3_3_0 (六) ---驾车、步行、公交路线搜索
- android百度地图之公交线路详情搜索
- Android百度地图附加搜索和公交路线方案搜索
- Android百度地图(地位和POI附近搜索)-仿微信、QQ地理位置的分享
- 百度地图之7公交换乘方案搜索(Android) .
- Android 百度地图(二)——地图切换、定位、添加覆盖物、搜索位置、连线
- Android 百度地图 SDK v3_3_0 (五) ---POI搜索和在线建议查询功能
- Android百度地图开发(五)公交线路详情搜索、多条线路显示
- 百度地图之八查询某一路公交路线详细搜索
- 百度地图API之公交换乘方案搜索(Android) .(12)
- 百度地图之搜索公交路线
- Android SDK for 百度地图【Demo兴趣搜索】
- Android百度地图开发(三)范围搜索
- 百度地图6之POI搜索-发现你身边的兴趣点,如超市、餐厅、ATM...(Android)
- 百度地图之公交线路详情搜索