Italian Ordinare una listview

pablan

Member
Ciao a tutti,
volevo chiedervi un aiuto. Ho creato una listview nella quale su doppia linea ho inserito il nome di un luogo (nella prima linea) e la distanza da un altro località (nella seconda linea). I dati li prende, con un ciclo for, da un database con colonna "nome" e colonne "latitudine" e "longitudine". Dopodichè ho inserito nella listview tutte le località che rientrano all'interno di un determinato raggio (con la libreria "gps" e il comando "distanceto"). Non riesco però a trovare un modo per ordinarli per distanza dal più vicino al più lontano. Mi vengono in mente dei possibili giri immensi per farlo ma immagino che ci sia qualche metodo più facile. Qui la parte del codice che riguarda il caricamento della listview (l'ho un po' accorciata). Grazie!
B4X:
Dim dist As Int
dim n as int
dim long as string
dim  lat as string

n=0

luogo1.Latitude =dbCursor.GetString ("latitudine") 'carica la latitudine  del luogo1 dal database
luogo1.Longitude=dbCursor.GetString ("longitudine") 'carica la longitudine del luogo1 dal database

For j = 0 To dbCursor.RowCount-1
DoEvents
dbCursor.Position=j
lat=dbCursor.GetString ("latitudine") 'carica la latitudine  del luogo2 dal database
long=dbCursor.GetString ("longitudine")'carica la longitudine del luogo2 dal database
luogo2.latitude =lat
luogo2.longitude=long
If luogo1.DistanceTo (luogo2) < 500 Then
n=n+1 'contatore per numerare quanti bar vi sono in questo raggio
dist=luogo1.DistanceTo (luogo2)
listluoghi.AddTwoLines(dbCursor.GetString ("nome"),"a " & dist & " metri" ) 'carica la listview con doppia colonna
End If
Next
If n=0 Then 'se il numero di bar è uguale a 0
Msgbox("Nessuna attività trovata nel raggio di 500 metri","")
Else
listluoghi.Visible=True
End If
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Io sostituirei la riga
B4X:
listluoghi.AddTwoLines(dbCursor.GetString ("nome"),"a " & dist & " metri" ) '
con
B4X:
Nome(n)=dbCursor.GetString ("nome")
Distanza(n)=dist
Poi riordinerei (QuickSort,BubbleSort o altro) i 2 array
Nome(0 to dbCursor.RowCount-1) as string
e
Distanza(0 to dbCursor.RowCount-1) as integer
e poi con un bel ciclo

For j = 0 To dbCursor.RowCount-1
listluoghi.AddTwoLines(Nome(j),"a " & Distanza(j) & " metri" )
next

visualizzerei la ListView.

Puoi mettere anche un paio di Option Button (o Radio Button) "Ordina per nome" e "Ordina per distanza"; in tal modo hai 2 modalità di visualizzazione.

Non sarà "all'ultima moda informatica" ma è una soluzione che per qualche decina o centinaio di record funziona.
 

pablan

Member
Grazie tante per il suggerimento. Alla fine ho cambiato qualcosa rispetto al tuo consiglio ma mi hai dato un buon indirizzo da seguire.
In process globals ho dichiarato:
Type luoghi (Nome2 As String, Distanza As Int)

poi al posto di:
B4X:
listluoghi.AddTwoLines(dbCursor.GetString ("nome"),"a " & dist & " metri" ) '

ho messo:
B4X:
p.Nome=dbCursor.GetString ("nome")
p.Distanza= dist
lista1.add (p)
lista1.SortType("Distanza",True)

avendo prima dichiarato:
B4X:
dim lista1 as list
lista1.initialize
Dim p As luoghi

e poi:

B4X:
For f = 0 To lista1.Size -1
Dim p As luoghi
        p = lista1.Get(f)
listluoghi.AddTwoLines(p.Nome,"a " & p.Distanza & " metri" )
Next
 
Top