Reputation: 990
I am binding a ListView
from JSONArray
. There is a string distance in it. I just want the list item having the minimum distance must appear as first item in ListView
and having maximum distance at last list item. Here is my Adapter.
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;
}
}
Thanks in Advance
Upvotes: 1
Views: 1059
Reputation: 76
Try:
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);
}
haven't tested it, but i think it should work.
Upvotes: 2
Reputation: 3220
So basically your adapter dataset is a hashMap. The hashmap has to be sorted but as the defination of the class says
This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.
We wiil use Map instead.
I have changed your code and the type please use this.
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;
}
Upvotes: 0
Reputation: 2837
You can use Comparator
Here's an example.
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;
}
};
EDIT:
I just found a link which provides a great tutorial for sorting Java Objects with examples using Comparator and Comparable.
Hope this helps :)
Upvotes: 1