如何将位置和距离添加到自定义布局android

时间:2013-06-06 19:04:52

标签: android list sorting location

我正在制作一个Android应用,它会列出不在Google地方的特定地点。我拥有所有纬度和经度以及地名,它们不会改变。我可以在我的自定义列表中显示它们并且它工作正常问题是我想要按距离(用户)位置对它们进行排序并显示它们旁边的距离。

我尝试了很多不同的方法但是有点卡住了。我想说我是编程的新手,有点磕磕绊绊地通过这个应用程序,如果有人可以提供帮助,那将非常感激。

所以问我的问题是我怎么能/应该按距离对位置进行排序,以便我可以将它们添加到我的自定义列表中。

// create array to hold place names to be looped through later
    String[] placenames = { "place1", "place2",
            "place3", "place4" };

// // create arrays to hold all the latitudes and longitudes
    double[] latArray = new double[] { 51.39649, 51.659775, 51.585433,
            51.659775 };
    double[] lngArray = new double[] { 0.836523, 0.539901, 0.555385,
            0.539901, };

// hard code my location for test purposes only
    Location MyLocation = new Location("My location");
    MyLocation.setLatitude(51.659775);
    MyLocation.setLongitude(0.539901);

    for (int i = 0; i < placenames.length;) {

// Place location object
        Location PlaceName = new Location(placenames[i]);
        PlaceName.setLatitude(latArray[i]);
        PlaceName.setLongitude(lngArray[i]);
        i++;

// calculate distance in meters
        float distanceInMeters = PlaceName.distanceTo(MyLocation);

// convert to double

        double DistanceInMiles = distanceInMeters * 0.000621371;

        dimint = (int) DistanceInMiles;

// format numbers to two decimal places
        DecimalFormat df = new DecimalFormat("#.##");
        dim = df.format(DistanceInMiles);

//make treemap and then sortedmap to sort places by distance

        TreeMap<Integer, String> treemap = new TreeMap<Integer, String>();

        SortedMap<Integer, String> treemapsorted = new TreeMap<Integer,String>();

        treemap.put(dimint, PlaceName.getProvider());

        treemapsorted = treemap.subMap(0, 5);

// Toast for test purpose to see if sort is working

        Toast tst = Toast.makeText(this, treemapsorted.entrySet()
                .toString(), Toast.LENGTH_SHORT);
        tst.show();

        CustomList place_data[] = new CustomList[] {

// This is the problem part 

        new CustomList(R.drawable.picture1, treemapsorted.get(dimint)),

        };

        CustomListAdapter adapter = new CustomListAdapter(this,
                R.layout.listview_item_row, place_data);
        listView1 = (ListView) findViewById(R.id.listView1);
        listView1.setAdapter(adapter);
        ;
    }

1 个答案:

答案 0 :(得分:0)

我刚刚审核了您的代码并发现了很多问题:

  1. 在for循环语句中使用i++而不是在循环体中使用for (int i = 0; i < placenames.length; i++) { } ,如下所示:

    Math.round()
  2. 您计算以英里为单位的距离,将其转换为int(我会在此处使用TreeMap),然后使用DecimalFormat创建一个您不使用的字符串。

  3. 您可以在每次循环迭代中创建一个TreeMap。将创建移动到循环前面,并在循环体中向其添加项目。

  4. TreeMap不适合此任务。我测试了你的代码,循环后Map只包含3个项目。原因是,TreeMap包含键值对,其中键必须是唯一的。添加一个带有键的元素(在您的情况下为距离)已经在地图中,导致覆盖该元素。因此,我推荐使用ArrayList而不是Comparable<Class>。您需要创建一个包含所需变量的类,例如距离和地名。该类需要实现接口public int compareTo(T other)。然后,您必须实现方法Collections.sort(arrayList),在该方法中将距离与另一个对象的距离进行比较。然后,您可以使用ListView对ArrayList进行排序。在for循环体中,您应该将项添加到该ArrayList,然后对其进行排序,然后迭代ArrayList项并将它们添加到{{1}}。