澳门威利斯人_威利斯人娱乐「手机版」

来自 网络资讯 2020-03-12 03:39 的文章
当前位置: 澳门威利斯人 > 网络资讯 > 正文

威尼斯人娱乐Android基于高德地图实现搜索框的自

近年来厂家项目中央直属机关接在搞地图开垦,几天前出品首席营业官就给自身计划了一些任务,当中贰个就是达成地方搜索输入框的自发性输入提示功用。取得职务显明想提出的条件开价一番,不过想到早先也写过,就不再负险固守了。

威尼斯人娱乐 1

花色地址:https://github.com/razerdp/FriendCircle
《一起撸个生活圈吧》 这是本文所处文集,全数更新都会在这里个文集里面哦,应接关切

在这里以往在本校的时候完毕过近似作用,是使用高德自带的InputtipsListener来实现的,想打听能够看看:小说传送点,这里就不详细介绍了。作为一名头脑发热的开辟者,确定无法听天由命,这里根本介绍任何二种办法

poi落成和http必要接口完毕,不管能否得逞,试了再说,撸起袖子正是干。先看看最终的效果与利益:

威尼斯人娱乐 2查找历史功效威尼斯人娱乐 3关键词搜索

做事情发生此前先解析一下成效必要,首先输入框中要加多内容杀绝的icon,当输入框有文字时,供给出示,为空时隐蔽;接着,要求完毕地点寻觅作用并经过listview显示结果;最终索要落实彰显寻找历史的成效。好的,那么下边大家来一步步落到实处。

其实,落成效益中的输入框并轻巧,只须要三个东西就够了:LinearLayout,EditText,ImageView。直接上代码吧,上了代码你就知道它到底有多轻巧了:

<LinearLayout android:layout_width="wrap_content" android:layout_height="36dp" android:layout_weight="1" android:layout_marginLeft="20dp" android:background="@drawable/search_view_bg" android:orientation="horizontal" android:gravity="center_vertical"> <EditText android: android:layout_width="wrap_content" android:layout_height="36dp" android:hint="@string/input_cross_location" android:textColorHint="#9B9B9B" android:textSize="12sp" android:maxLines="1" android:layout_weight="1" android:paddingBottom="10dp" android:paddingTop="10dp" android:paddingLeft="10dp" android:background="@drawable/search_edit_bg" android:drawableLeft="@mipmap/icon_edit_search" android:drawablePadding="16dp"/> <ImageView android: android:layout_width="12dp" android:layout_height="12dp" android:layout_marginLeft="5dp" android:layout_marginRight="8dp" android:visibility="gone" android:src="@mipmap/iocn_search_cancel"/> </LinearLayout>

确实无疑,这里为艾德itText父容器LinearLayout设置背景,然后EditText设置雷同的背景,只然则必要将左侧的圆角功效去掉,达到预期效果。也等于说,大家的输入框约等于是LinearLayout,里面含有了edittext和删除Logoimageview,来探视drawable的代码吧:

search_view_bg:

<?xml version="1.0" encoding="utf-8"?><selector xmlns:andro> <item android:state_window_focused="false"> <shape xmlns:andro> <!--<solid android:color="#F4F4F4" />--> <corners android:radius="3dp"/> <solid android:color="#F3F3F3"/> <!--<stroke android:color="#ffececec" android:width="1dp"/>--> </shape> </item> <item android:state_window_focused="true"> <shape> <corners android:radius="3dp"/> <!--<stroke android:color="#ececec" android:width="1dp" />--> <solid android:color="#F3F3F3"/> <!--<solid android:color="#F4F4F4" />--> </shape> </item></selector>

search_edit_bg:

<?xml version="1.0" encoding="utf-8"?><selector xmlns:andro> <item android:state_window_focused="false"> <shape xmlns:andro> <!--<solid android:color="#F4F4F4" />--> <corners android:topLeftRadius="3dp" android:bottomLeftRadius="3dp"/> <solid android:color="#F3F3F3"/> <!--<stroke android:color="#ffececec" android:width="1dp"/>--> </shape> </item> <item android:state_window_focused="true"> <shape> <corners android:topLeftRadius="3dp" android:bottomLeftRadius="3dp"/> <!--<stroke android:color="#ececec" android:width="1dp" />--> <solid android:color="#F3F3F3"/> <!--<solid android:color="#F4F4F4" />--> </shape> </item></selector>

ok,那就完结了最终的输入框UI,当然,你能够行使其余方法得以达成,比方自定义view,第三方开源等等,但本身觉着这一丝一毫知足我们的要求,况宽轻松,不是吗?接下去,大家要求经过监听艾德itText的转移来实现寻觅框中删除的生成,代码如下:

 @Bind(R.id.search_edit_text) EditText inputText; @Bind(R.id.search_edit_delete) ImageView buttonDelete; ...... buttonDelete.setOnClickListener; inputText.addTextChangedListener; ...... @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { if(charSequence!=null){ buttonDelete.setVisibility(View.VISIBLE); }else { buttonDelete.setVisibility(View.GONE); } } @Override public void afterTextChanged(Editable editable) { } 

代码比较容易,就不表达了,不了然这一个方法的能够Google时而,大家随后往下看。

用过高德地图api的开荒者应该都晓得在那之中有个常用的效劳:POI寻找.高德提供了相对等第的POI(Point of Interest,兴趣点)。在地形图表达中,三个 POI 可代表一栋高楼、一家商店、一处景点等等。通过POI寻找,达成找商旅、找景点、找厕所等等的意义。假如大家的须要是获取周边兴趣点,那么寻觅输入提醒只要出示兴趣点就足以了。 下边大家来挨门挨户通过三种方法来贯彻高效输入提醒效能:

  • POI搜索达成:

话非常的少说,直接上代码:

//方法一:使用poi搜索接口方法 private PoiResult poiResult; // poi返回的结果 private int currentPage = 0;// 当前页面,从0开始计数 private PoiSearch.Query query;// Poi查询条件类 private LatLonPoint latLonPoint; private PoiSearch poiSearch; private List<PoiItem> poiItems;// poi数据 private String keyWord; private CommonAdapter adapter; private final int ADDRESS_LOCATION_GET = 3242; private String POI_SEARCH_TYPE = "汽车服务|汽车销售|"   "//汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|"   "//住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|"   "//金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施"; ...... /** * 开始进行poi搜索 */ protected void doSearchQuery() { latLonPoint = new LatLonPoint(MyApplication.mapLocation.getLatitude(), MyApplication.mapLocation.getLongitude;// 116.472995,39.993743 keyWord = inputText.getText().toString; currentPage = 0; //keyWord表示搜索字符串, //第二个参数表示POI搜索类型,二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考下方 //cityCode表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索 query = new PoiSearch.Query(keyWord, POI_SEARCH_TYPE, ""); query.setPageSize;// 设置每页最多返回多少条poiItem query.setPageNum(currentPage);// 设置查第一页 if (latLonPoint != null) { poiSearch = new PoiSearch(this, query); poiSearch.setOnPoiSearchListener; poiSearch.setBound(new PoiSearch.SearchBound(latLonPoint, 3000, true));//设置搜索范围 poiSearch.searchPOIAsyn();// 异步搜索 } } ...... @Override public void onPoiSearched(PoiResult result, int code) { //DialogUtils.dismissProgressDialog(); if (code == AMapException.CODE_AMAP_SUCCESS) { if (result != null && result.getQuery() != null) {// 搜索poi的结果 loge("搜索的code为====" code ", result数量==" result.getPois; if (result.getQuery().equals {// 是否是同一次搜索 poiResult = result; loge("搜索的code为====" code ", result数量==" poiResult.getPois; List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息 if (poiItems != null && poiItems.size { poiItems.clear(); if (adapter != null) { adapter.notifyDataSetChanged(); } } poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始 //通过listview显示搜索结果的操作省略 ...... } } else { loge; toast(getString(R.string.search_no_result)); empty_view.setText(getString(R.string.search_no_result)); } } else { loge; toast(getString(R.string.search_error)); empty_view.setText(getString(R.string.search_error)); } } @Override public void onPoiItemSearched(PoiItem poiItem, int i) { } 

声明都相比清楚,大家知晓起来应当也轻松,具体用法能够参见高德官方文书档案,能够一向在onTextChangeed(卡塔尔(قطر‎方法中推断是不是有内容来调用doSearchQuery(卡塔尔(قطر‎方法就可以。

  • 由此实时访谈http接口达成:除了以上措施完毕,还足以用高德提供的web端API接口达成效果与利益,详细情况见高德web服务付出文书档案。大家得以一向通过恳求高德为大家提供的找出url接口来走访并获取数据,输入提醒API服务地点为::
 //方法二:使用http请求返回搜索结果 private List<POISearchResultBean.Tips> tipsList; private POISearchResultBean resultBean; private String locationString; private String lon; private String lat; private final int SEARCH_OK = 3266; @Bind(R.id.search_result_listview) ListView resultListView; ....... private MapSerchActivity.MyWeakReferenceHandler handler = new MapSerchActivity.MyWeakReferenceHandler { @Override public void handleMessage(Message msg, Activity weakReferenceActivity) { if (msg.what == ADDRESS_LOCATION_GET) { if (tipsList != null && tipsList.size { if (adapter == null && resultListView != null) { //wrong resultListView.setAdapter(adapter = new CommonAdapter<POISearchResultBean.Tips>(SearchAddressActivity.this, tipsList, R.layout.search_result_item) { @Override public void convert(ViewHolder helper, final POISearchResultBean.Tips item) { helper.setText(R.id.search_result_item_address_name, item.getName; helper.setText(R.id.search_result_item_address_detail, item.getDistrict() item.getAddress; helper.getView(R.id.search_result_item_address_layout).setOnClickListener(new View.OnClickListener() { @Override public void onClick { loge("点击了item"); toast(item.getName; boolean hasData = hasData(item.getName; if  { insertData(item.getName; //queryData; } locationString = item.getLocation(); lon = locationString.substring(0,locationString.indexOf; lat = locationString.substring(locationString.indexOf 1,locationString.length; loge("经纬度信息为===" lon "," lat); Intent intent = new Intent(); intent.putExtra("location_lon",lon); intent.putExtra("location_lat",lat); setResult(SEARCH_OK, intent); finish; } }); } else { adapter = null; resultListView.setAdapter(adapter = new CommonAdapter<POISearchResultBean.Tips>(SearchAddressActivity.this, tipsList, R.layout.search_result_item) { @Override public void convert(ViewHolder helper, final POISearchResultBean.Tips item) { helper.setText(R.id.search_result_item_address_name, item.getName; helper.setText(R.id.search_result_item_address_detail, item.getDistrict() item.getAddress; helper.getView(R.id.search_result_item_address_layout).setOnClickListener(new View.OnClickListener() { @Override public void onClick {// loge("点击了item"); loge("点击了item"); toast(item.getName; boolean hasData = hasData(item.getName; if  { insertData(item.getName; //queryData; } locationString = item.getLocation(); lon = locationString.substring(0,locationString.indexOf; lat = locationString.substring(locationString.indexOf 1,locationString.length; loge("经纬度信息为===" lon "=====" lat); Intent intent = new Intent(); intent.putExtra("location_lon",lon); intent.putExtra("location_lat",lat); setResult(SEARCH_OK, intent); finish; } }); } } } } }; ....... /** * by moos on 2017/09/11 * func:http请求返回关键词搜索结果 * 请求路径范例:http://restapi.amap.com/v3/assistant/inputtips?key=您的key&keywords=肯德基&types=050301&location=116.481488,39.990464&city=北京&datatype=all */ private void searchAddressByHttp(String keyWord){ //DialogUtils.createProgressDialog(SearchAddressActivity.this,"Searching..."); OkHttpUtils .get() .url(HttpAPI.AMAP_POI_SEARCH_URL   "key=" Const.amap_poi_search_key "&keywords=" keyWord) .build() .execute(new StringCallback() { @Override public void onError(Call call, Exception e, int id) { loge("获取http poi搜索结果失败="   e.getMessage; //DialogUtils.dismissProgressDialog(); Toast.makeText(SearchAddressActivity.this, getString(R.string.act_qr_code_fail), Toast.LENGTH_LONG).show(); } @Override public void onResponse(String response, int id) { Logger.e("获取http poi搜索结果 ="   response); resultBean = JSONObject.parseObject(response, POISearchResultBean.class); if (resultBean.getStatus { //处理和显示搜索数据列表 if (tipsList != null && tipsList.size { tipsList.clear(); if (adapter != null) { adapter.notifyDataSetChanged(); } } tipsList = resultBean.getTips(); Message message = Message.obtain; message.what = ADDRESS_LOCATION_GET; handler.sendMessage; } else { toast("搜索失败,请重新尝试"); } } }); } 

由此okhttp央浼网络接口有成都百货上千大神封装好的工具库,这里自个儿动用的鸿神的okHttpUtils,大家可以依附本身的急需来抉择。同一时间,这里运用了CommonAdapter来作为listview的适配器,同样是鸿神的名著,假若你对它目生,建议去看一下那篇作品:营造listview万能适配器。别的的就没怎么难题了,关键依然靠本身研商和演练一下了。

末段,让大家来看看哪些促成体现寻找历史的作用吗。先深入分析一下要求:首先步入到找出分界面要显得寻觅历史列表,然后能够点击列表下方的清空历史来消灭数据,接着,当大家探寻地名并入选时,自动存入寻觅历史。其实,提起底,正是七个小成效,数据存款和储蓄和数目展现,下边依次来切磋怎样贯彻。

  • 寻找历史数据的存款和储蓄:

相通地,大家会将寻觅的历史数据保存在地点。常用的二种办法分别为数据仓库储存款和储蓄和sp(SharedPreference卡塔尔(قطر‎存款和储蓄,二种方式都得以兑现大家的急需,这里本人才用的是数据库,不经常间的话我们能够尝试sp存储形式。这里不切磋数据库的中坚用法比较轻易,就一笔带过了,直接上代码:

第一是创设数据库:

/** * Created by moos on 17/9/11. */public class SearchHistorySQLiteHelper extends SQLiteOpenHelper { private static String name = "search.db"; private static Integer version = 1; public SearchHistorySQLiteHelper(Context context) { super(context, name, null, version); } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { sqLiteDatabase.execSQL("create table history(id integer primary key autoincrement,name varchar; } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { }}

具体操作:

//历史搜索功能 private SearchHistorySQLiteHelper helper = new SearchHistorySQLiteHelper; private SQLiteDatabase db; private BaseAdapter baseAdapter; @Bind(R.id.search_history_listview) ListView search_history_listView; @Bind(R.id.search_history_view) LinearLayout search_history_view; ...... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_address); ButterKnife.bind; initView(); } private void initView(){ buttonCancel.setOnClickListener; buttonDelete.setOnClickListener; inputText.addTextChangedListener; search_history_listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { loge("点击了第" position "个搜索历史item"); TextView textView =  view.findViewById(R.id.search_history_item_address_name); String name = textView.getText().toString(); inputText.setText; Toast.makeText(SearchAddressActivity.this, name, Toast.LENGTH_SHORT).show; // 第一次进入查询所有的历史记录 queryData; } ...... //采用本地数据库存储 /** * 插入数据 */ private void insertData(String tempName) { db = helper.getWritableDatabase(); db.execSQL("insert into history values('"   tempName   "')"); db.close(); } /** * 模糊查询数据 */ private void queryData(String tempName) { Cursor cursor = helper.getReadableDatabase().rawQuery( "select id as _id,name from history where name like '%"   tempName   "%' order by id desc ", null); // 创建adapter适配器对象 baseAdapter = new SimpleCursorAdapter(this, R.layout.search_history_item, cursor, new String[] { "name" }, new int[] { R.id.search_history_item_address_name }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); //添加footerView View footerView = LayoutInflater.from.inflate(R.layout.delete_search_history_bt,null); search_history_listView.addFooterView(footerView,null,false); footerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { deleteData(); toast; } }); // 设置适配器 search_history_listView.setAdapter(baseAdapter); baseAdapter.notifyDataSetChanged(); if(baseAdapter.getCount{ //无历史搜索记录 search_history_view.setVisibility(View.GONE); } } /** * 检查数据库中是否已经有该条记录 */ private boolean hasData(String tempName) { Cursor cursor = helper.getReadableDatabase().rawQuery( "select id as _id,name from history where name =?", new String[]{tempName}); //判断是否有下一个 return cursor.moveToNext(); } /** * 清空数据 */ private void deleteData() { db = helper.getWritableDatabase(); db.execSQL("delete from history"); db.close(); loge("搜索历史数据删除成功"); queryData; }

数据库的操作网络广大科目和文章,这里就非常的少加解释,首要说一下逻辑吗。首先,我们输加入关贸总协定组织键词搜索到相应的对象地址后,点击回调中,即插入一条该地名的多少。当然,为了防御再一次,大家供给看清一下数据库中是不是已经存在该数量。大家刚进来搜索分界面包车型地铁时候,必要查询数据库中持有的数量并展现。

  • 查找历史数据的来得和删除:

显示的话没怎么太大的主题材料,经常接受listview展现并为item加上点击事件就OK了,首要是要安装好体现数据和刷新数据的逻辑。这里关键提一下什么样促成下方"消弭寻找历史"的团结显示以至逻辑。

借使有人问您哪些赶快达成listview下边包车型地铁button依赖效果,你会怎么回复?何奇之有的回复日常常有二种:

1.在listview下边放二个button,然后外面套一层ScrollerView

2.运用listview的addFooterView(State of Qatar给其增加头部布局

虽说二种艺术相当的轻巧想到,不过对于大家那么些新手来讲,入手完结起来有一点有个别弯弯绕绕。譬如第一种办法,大家必要思谋怎么处理嵌套滑动的主题材料,至于第二种,无非是研商listview之footerview的用法,当然,抛开各自的难题,第三种方法唯有特别华贵一些,所以,这里只谈谈怎样运用该措施完毕。首先看一下footerview的结构:

search_history_item:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"> <TextView android: android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:gravity="center" android:text="清楚搜索历史" android:textSize="12sp" android:layout_marginBottom="15dp" android:textColor="#828282"/></LinearLayout>

listview增加footerview比较轻巧,只通过不难的两行代码:

//添加footerViewView footerView = LayoutInflater.from.inflate(R.layout.delete_search_history_bt,null);search_history_listView.addFooterView(footerView,null,false);

个人签字

上篇链接:http://www.jianshu.com/p/8d24f9b7a63a
下篇链接:http://www.jianshu.com/p/4be8daaef3ca

便得以兑现,可是footerview的点击事件怎么着得到呢?很六个人说一贯用onItenClickListener(State of Qatar呀,然而,大家能够因而log恐怕toast看看,点击footerview是还是不是真正响应了。答案是

并未。大家应当尽量防止在onITemClickListener回调方法中得以完毕footerview点击事件,因为position并从未变动,上限依然是原先的adapter.getCount(卡塔尔。大家能够先禁绝footerview在item中的点击响应,即addFooterView(卡塔尔(قطر‎方法第多个参数设为false,然后给footerView单独设置点击事件:

footerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { deleteData(); toast; } });

到此处,大家就完整兑现了地图的寻觅效果了,就算完毕的诀要比较简单,但依然学到一些事物的。前面对时间会将该片段机能做个demo单独共享出去。其余大家如若有如何难点和优化建议,款待留言反映,不胜多谢。

末尾,请教一下放权力族mac如何录像gif呢,为什么本身用licecap录像出来的是黑屏呢.

从五一放假回来就直接在搞上线的品种,也没怎么写小说,上星期一算是主导竣事了。未来有的时候间商讨其余技艺,笔者在逛网页时,无意间看见了八个搜寻成效,有一些相似Taobao寻找功用。废话相当的少说,直奔大旨。


功能截图

威尼斯人娱乐 4

效果图

威尼斯人娱乐 5

来得找寻历史

威尼斯人娱乐 6

协理模糊搜索

威尼斯人娱乐 7

点击寻觅,数据插入数据库

威尼斯人娱乐 8

回车键改为找出键

因为方今忙于弄结业设计,所以仿交际圈那几个项目暂时听了几天,今天花了好几时间把上叁次的坑补充。
ps:因为是在太忙,服务器后台交互作用尚未起始写,所以商议临时来讲是无法贯彻的啊,以后仅仅是UI上的操作

本文由澳门威利斯人发布于网络资讯,转载请注明出处:威尼斯人娱乐Android基于高德地图实现搜索框的自

关键词: 澳门威利斯人 功能 提示 地图