2017-09-06 56 views
9

我想重新排序我的项目列表(使用android getListView,而不是自定义)的距离,我有问题。Android按距离重新排序适配器

我使用Maps Utils 内部的适配器(SomeAdapter)获得以米为单位的球面距离(双倍)。

double distance = SphericalUtil.computeDistanceBetween(fromCoord, toCoord);

但经过我填的是适配器(的AsyncTask)我需要通过短我onPostExecute距离,我不知道。

@Override 
    protected void onPostExecute(Boolean result) { 
     try { 
      SQLiteHelper dbHelper = new SQLiteHelper(getActivity()); 
      pds = new SomeDataSource(dbHelper.db); 

      ArrayList<Raids> some = pds.getAllRaids(); 

      SomeAdapter listViewAdapter = new SomeAdapter(getActivity(), some); 
      getListView().setAdapter(listViewAdapter); 

      SharedPreferences somename = context.getSharedPreferences("SomeName", Context.MODE_PRIVATE); 
      Boolean UserOrder = somename.getBoolean("UserOrder", false); 
      if (UserOrder){ 

      } 

     } catch (SQLiteException | NullPointerException s) { 
      Log.d("SomeName", "SomeFrag:", s); 
     } 
    } 

谢谢

+1

https://stackoverflow.com/questions/2784514/sort-arraylist-自定义对象的属性 –

+0

在什么*方法*你叫'双距离= SphericalUti l.computeDistanceBetween(fromCoord,toCoord);' –

+0

@NickCardoso我的适配器,但你可以在任何地方调用它。 – FilipeOS

回答

7

就实现你的RaidsComparable接口 -

class Raids implements Comparable<Raids> { 
    private double distance; 
    ... 

    @Override 
    public int compareTo(Raids instance2) { 
     if (this.distance < instance2.distance) 
      return -1; 
     else if (this.distance > instance2.distance) 
      return 1; 
     else 
      return 0; 
    } 
} 

然后在其上调用Collections.sort -

ArrayList<Raids> some = pds.getAllRaids(); 
Collections.sort(some); 

而且更新适配器 -

listViewAdapter.notifyDataSetChanged(); 
+0

嗨,距离计算适配器内,因为我获取实际坐标和新的(当前项目),并转换为米(双)。你为什么把它放在Raids课堂内?班级如何知道该项目的正确距离? – FilipeOS

+0

另外Double不会保存在数据库中,我只用它来计算适配器内部和打印。 – FilipeOS

+0

@FilipeOS我认为'distance'是'Raids'类的一个字段。如果不是,那么排序是不可能的,因为它需要类的成员执行排序。你能更清楚地解释你在做什么吗? – jL4

1

鉴于你的代码:

ArrayList<Raids> some = pds.getAllRaids(); 
SomeAdapter listViewAdapter = new SomeAdapter(getActivity(), some); 

您需要:

class SomeAdapter ... { 

    private ArrayList<Raids> mData; 

    //TODO: now call this method instead of computeDistanceBetween directly 
    private void calculateForitem(Raids item) { 
     double distance = SphericalUtil.computeDistanceBetween(item.fromCoord, item.toCoord); 
     item.setDistance(distance); 
     Collections.sort(mData); //the list inside adapter 
     notifyDataSetChanged(); 
    } 

} 

class Raids implements Comparable<Raids> { 

    private double distance; 
    ... 

    @Override 
    public int compareTo(Raids instance2) { 
     return (this.distance < instance2.distance)? -1 : (this.distance > instance2.distance)? 1 : 0; 
    } 

}