0

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

我想在每个列表项的 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;
        }
4

2 回答 2

1

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

您在这里所做的是错误地使用了 Location 对象。如果您查看您正在使用的构造函数的文档,您会发现这只是返回一个默认位置对象并且不包含设备的实际位置。此外,您传递给 this 的字符串不是任意的,它是与此 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

于 2012-04-16T14:39:01.857 回答
1
Location newLocation = new Location("User");

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

LocationManager.getAllProviders();

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

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

LocationManager.getLastKnownLocation(null);
于 2012-04-16T15:10:30.043 回答