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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top