2017-09-06 1 views
9

Ich versuche, meine Artikel-Liste (mit Android getListView, nicht benutzerdefinierte) nach Entfernung und ich habe Probleme.Android Re-Order-Adapter nach Entfernung

Ich bekomme die Sphärische Entfernung in Metern (doppelt) mit Maps Utils innerhalb der Adapter (SomeAdapter).

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

Aber nachdem ich füllen Sie den Adapter (AsyncTask) I nach Entfernung auf meine OnPostExecute zu kurz brauchen, und ich habe keine Ahnung.

@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); 
     } 
    } 

Danke

+1

https://stackoverflow.com/questions/2784514/sort-arraylist- von-custom-objects-by-property –

+0

in welcher * Methode * nennen Sie 'double distance = SphericalUti l.computeDistanceBetween (fromCoord, toCoord); ' –

+0

@ NickCardoso Mein Adapter, aber Sie können es überall anrufen. – FilipeOS

Antwort

7

einfach die Comparable Schnittstelle in Ihrer Raids Klasse implementieren -

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; 
    } 
} 

Dann Collections.sort auf ihn nennen -

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

und den Adapter aktualisieren -

listViewAdapter.notifyDataSetChanged(); 
+0

Hallo, der Abstand wird innerhalb des Adapters berechnet, da ich die tatsächlichen Koordinaten und die neuen (aktuellen Artikel) abrufe und in Meter umwandle (double). Warum stellst du es in die Raids-Klasse? Wie kann die Klasse wissen, dass die richtige Entfernung von diesem Gegenstand ist? – FilipeOS

+0

Auch das Double wird nicht in der Datenbank gespeichert, ich benutze es nur um innerhalb des Adapters zu berechnen und zu drucken. – FilipeOS

+0

@FilipeOS Ich nahm an, dass 'distance' ein Feld der' Raids' Klasse war. Wenn dies nicht der Fall ist, ist das Sortieren nicht möglich, da ein Mitglied der Klasse die Sortierung durchführen muss. Kannst du deutlicher erklären, was du tust? – jL4

1

Gegeben Code:

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

Sie benötigen:

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(); 
    } 

} 

und

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; 
    } 

}