Ordinamento elencoview in Android
-
23-12-2019 - |
Domanda
Sono vincolante un ListView
da JSONArray
.C'è una distanza di corda in esso.Voglio solo che l'elemento dell'elenco avendo la distanza minima deve apparire come primo elemento in ListView
e avere la massima distanza in ultima lista.Ecco il mio adattatore.
public class NearByDockITAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater = null;
int loader;
public NearByDockITAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data = d;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
@SuppressLint("DefaultLocale")
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(R.layout.list_view_item_layout, null);
TextView addressTextView = (TextView) vi
.findViewById(R.id.dockitaddresstext); // Address
HashMap<String, String> events = new HashMap<String, String>();
events = data.get(position);
String distanceString = events.get(Utility.DISTANCE);
String dis = distanceString;
addressTextView.setText("(" + dis + ") " + addressString);
return vi;
}
}
.
Grazie in anticipo
Soluzione
Prova:
public NearByDockITAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
Collections.sort(d, new Comparator<HashMap<String,String>>() {
public int compare(HashMap<String,String> a, HashMap<String,String> b) {
String distanceString1 = a.get(Utility.DISTANCE);
String distanceString2 = b.get(Utility.DISTANCE);
return compareDist(distanceString1,distanceString2);
}
private int compareDist(String distanceString1,String distanceString2) {
int i1 = Integer.parseInt(distanceString1);
int i2 = Integer.parseInt(distanceString2);
return i1 - i2;
}
});
data = d;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
.
non lo ha testato, ma penso che dovrebbe funzionare.
Altri suggerimenti
Puoi usare comparatore
Ecco un esempio.
Comparator<String> StringComparator = new Comparator<String>() {
public int compare(String d1, String d2) {
Integer i1 = Integer.parseInt(d1);
Integer i2 = Integer.parseInt(d2);
// for ascending
return (int) Math.signum(i1.compareTo(i2));
// for descending
// return (int) Math.signum(i1.compareTo(i2)) * -1;
}
};
.
Modifica:
Ho appena trovato un link che fornisce un ottimo tutorial per l'ordinamento degli oggetti Java con esempi usando comparatore e comparabile .
Spero che questo aiuti :)
Quindi fondamentalmente il tuo set di dati dell'adattatore è un hashmap.L'hashmap deve essere ordinato ma come la definazione della classe dice
.Questa classe non fa garanzie sull'ordine della mappa;nel Particolare, non garantisce che l'ordine rimarrà costante nel tempo.
wiil usiamo invece mappa.
Ho cambiato il tuo codice e il tipo si prega di utilizzare questo.
public class NearByDockITAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<Map<String, String>> data;
private static LayoutInflater inflater = null;
int loader;
public NearByDockITAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data = new ArrayList<Map<String,String>>();
for (Iterator<HashMap<String, String>> iterator = d.iterator(); iterator.hasNext();) {
Map<String, String> map = sortByValues(iterator.next());
data.add(map);
}
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
@SuppressLint("DefaultLocale")
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(R.layout.list_view_item_layout, null);
TextView addressTextView = (TextView) vi
.findViewById(R.id.dockitaddresstext); // Address
HashMap<String, String> events = new HashMap<String, String>();
events = data.get(position);
String distanceString = events.get(Utility.DISTANCE);
String dis = distanceString;
addressTextView.setText("(" + dis + ") " + addressString);
return vi;
}
}
public static <K extends Comparable, V extends Comparable> Map<K, V> sortByValues(Map<K, V> map) {
List<Map.Entry<K, V>> entries = new LinkedList<Map.Entry<K, V>>(map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<K, V>>() {
@Override
public int compare(Entry<K, V> o1, Entry<K, V> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
Map<K, V> sortedMap = new LinkedHashMap<K, V>();
for (Map.Entry<K, V> entry : entries) {
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
.