Varun Vishnoi
Varun Vishnoi

Reputation: 990

ListView Sorting in Android

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

Answers (3)

Dan Cuc
Dan Cuc

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

Hardik4560
Hardik4560

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

Ankit Popli
Ankit Popli

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

Related Questions