显示ListView上2个位置之间的距离

时间:2012-04-16 14:27:10

标签: android

我有一个ListView的View Adapter方法,它是从JSON文件填充的。

我想在每个列表项的TextView上显示的组件之一是用户位置与ListView上显示的每个位置之间的距离。

但每次运行时应用程序都崩溃了,我知道我的代码从//calculate the distance开始出现了问题。

有人可以帮我分析并修正我可能出错的地方吗?

以下是JSON中经过解析的经度和纬度的示例:

 "latitude": 52.5074779785632,
 "longitude": 13.3903813322449,

这是我正在使用的方法:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if(convertView == null){
                convertView = LocationsListActivity.this.getLayoutInflater().inflate(R.layout.listitems, null, true);
            }

            VideoLocation vidLocation = videoLocations[position];
            ImageView v = (ImageView)convertView.findViewById(R.id.image);
            String url = vidLocation.documentary_thumbnail_url;
            v.setTag(url);
            loader.DisplayImage(url, ctx, v);
            TextView titleView = (TextView)convertView.findViewById(R.id.txt_title);
            String title = vidLocation.name;
            titleView.setText(title.toUpperCase());
            TextView descView = (TextView)convertView.findViewById(R.id.txt_list_desc);
            String desc = vidLocation.text;
            descView.setText(desc);

            //calculate the distance
            Location newLocation = new Location("User");
            GeoPoint geopoint = new GeoPoint(
                    (int) (newLocation.getLatitude() * 1E6), (int) (newLocation
                            .getLongitude() * 1E6));
            GeoPoint myposition = geopoint;
            Location locationA = new Location("point A");
            Location locationB = new Location("point B");
            locationA.setLatitude(geopoint.getLatitudeE6() / 1E6);
            locationA.setLongitude(geopoint.getLongitudeE6() / 1E6);

            locationB.setLatitude(vidLocation.latitude/ 1E6);
            locationB.setLongitude(vidLocation.longitude / 1E6);

            double distance = locationA.distanceTo(locationB);
            String distances = String.valueOf(distance);
            TextView distanceView = (TextView)convertView.findViewById(R.id.txt_distance);
            System.out.println(distances);
            distanceView.setText(distances+" m");

            return convertView;
        }

2 个答案:

答案 0 :(得分:1)

当您的应用程序崩溃并且您在StackOverflow上询问它时,您应该始终包含崩溃详细信息的logcat输出。答案几乎总是在那里,很容易挑选出来。

您在这里做的是错误地使用Location对象。如果你查看你正在使用的构造函数的文档,你会发现它只返回一个默认的位置对象,并且不包含设备的实际位置。此外,您传递给它的字符串不是任意的,它是与此Location对象关联的位置提供者的名称。

要获取用户的上一个已知位置,请获取LocationManager的实例并调用getLastKnownLocation。这也需要一个字符串,该字符串对应于应该使用的位置提供者。

阅读有关获取用户位置的文档,并查看Criteria对象和LocationManager.getBestProvider方法。这些是获得最佳位置并且不会在此过程中崩溃的最安全方式。例如,如果您请求位置传递GPS提供程序字符串并且设备没有GPS或用户关闭了GPS,则代码将崩溃(我相信在这种情况下您从getLastKnownLocation获取空对象)。还要确保为清单添加适当的权限。

http://developer.android.com/guide/topics/location/obtaining-user-location.html

http://developer.android.com/reference/android/location/Criteria.html

http://developer.android.com/reference/android/location/LocationManager.html

答案 1 :(得分:1)

Location newLocation = new Location("User");

“用户”不是有效的LocationProvider。它至少应该是

之一
LocationManager.getAllProviders();

(通常是“gps”或“网络”)

此外,在您的代码中,newLocation并未真正初始化。它的值很可能是空的。您应该获得用户位置,例如:

LocationManager.getLastKnownLocation(null);