在Android中得到当前位置的步骤 1.在AndroidManifest.xml中声明权限android.permission.ACCESS_FINE_LOCATION(或者android.permission.ACCESS_COARSE_LOCATION)
创新互联公司10多年成都定制网站服务;为您提供网站建设,网站制作,网页设计及高端网站定制服务,成都定制网站及推广,对成都LED显示屏等多个领域拥有多年的网站营销经验的网站建设公司。
2.声明并实例化一个LocationManager对象 这个类提供了关于获取位置信息的服务,用于管理Android的定位服务。这个类允许应用定期的更新地理位置信息,同时允许当到达指定地点时候激活相关的Intent。LocationManager locMan = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
3.声明并设置Criteria对象。 这个类是用来选择合适的provider的,他设置了一些条件,通过对这些条件进行筛选,系统得到最优的provider对象。条件有:精度,耗电量,海拔,方位,速度以及付费情况等。Criteria criteria=new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE); //精度要求:
ACCURACY_FINE(高)ACCURACY_COARSE(低)
criteria.setAltitudeRequired(false); // 不要求海拔信息
criteria.setBearingAccuracy(Criteria.ACCURACY_HIGH); //方位信息的精度要求:
ACCURACY_HIGH(高)ACCURACY_LOW(低)
criteria.setBearingRequired(false); // 不要求方位信息
criteria.setCostAllowed(true); // 是否允许付费
criteria.setPowerRequirement(Criteria.POWER_LOW); // 对电量的要求 (HIGH、MEDIUM)
首先导入依赖:
首次导入依赖的过程可能有点慢
然后在需要用到逆地理编码的类或弹窗或其他地方中实现 GeocodeSearch.OnGeocodeSearchListener
监听
例子:
并实现其两个方法:
通过经纬度逆地理编码得到位置核心编码
这样我们就可以实现通过经纬度得到一个位置信息了
福利赠送~~~
1、继承 OnGeocodeSearchListener 监听。
2、构造 GeocodeSearch 对象,并设置监听。
3、通过 GeocodeQuery(java.lang.String locationName, java.lang.String city) 设置查询参数,调用 GeocodeSearch 的 getFromLocationNameAsyn(GeocodeQuery geocodeQuery) 方法发起请求。
4、通过回调接口 onGeocodeSearched 解析返回的结果。
说明:
1)可以在回调中解析result,获取坐标信息。
2)返回结果成功或者失败的响应码。1000为成功,其他为失败(详细信息参见网站开发指南-实用工具-错误码对照表)
1,如果想在Recycler View里直接获取:
可以把接口的方法写在:
方法里面,用position参数,
2,如果想写在ViewHolder里面,则调用getAdapterPosition()方法:
注:
由于需要在Adapter里处理item的点击事件,所以获取Item位置有个方法:
getAdapterPosition()
但是由于RecyclerView的ViewHolder存在回收机制,所以item位置会不准确;
解决方法有:
a、标记不回收;
这样直接“阉割”了RecyclerView最大的特点, 十分不推荐
b、重写方法:
再正常用getAdapterPosition()就可以了
还有别的方法
原文链接:
注:RecyclerView中获取Item位置的两种方法
getAdapterPosition()返回ViewHolder中当前展示的Adapter的位置。getLayoutPosition返回的是最新的Layout的位置信息。二者在一般情况下,获取的结果是一致的。
有一种情况,在notifyDataSetChanged()操作的时候,Adapter中数据的更新和Layout布局的更新会有先后的时间差,当Adapter数据更新了,但是Layout布局却还没有刷新,通过getAdapterPostion和getLayoutPosition或者的结果就会有差异。
RececlerView在Layout遍历之前不会去处理Adapter的更新,所以这就会造成实际看到的Layout的数据和Adapter中实际的数据是有差异的。不过,好在这个时间差一般不会超过16ms,所以视觉上一般是没有影响的,但是如果这个时候希望通过getAdapterPostion()得到的返回值为NO_POSITION(-1),在使用这个结果的时候,可能需要做异常处理,否则可能会出现ArrayIndexOutOfBoundsException的异常。
在Adapter数据更新之后,只有在布局重新遍历之后,Layout的位置信息才会更新。在此之前,通过getLayoutPosition()获取的位置信息,是更新布局之前的位置信息,所以通过getLayoutPosition获取的结果有可能是脏数据。
参考: