2017-09-06 30 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; 
    } 

}