1

我正在绑定一个ListViewfrom JSONArray。其中有一个字符串距离。我只希望具有最小距离的列表项必须作为第一项出现,ListView并且在最后一个列表项中具有最大距离。这是我的适配器。

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;

   }
 }

提前致谢

4

3 回答 3

2

尝试:

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

没有测试过,但我认为它应该可以工作。

于 2014-02-27T07:25:28.910 回答
1

您可以使用比较器

这是一个例子。

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

编辑:

我刚刚找到了一个链接,它提供了一个很好的教程,用于通过使用ComparatorComparable的示例对 Java 对象进行排序。

希望这可以帮助 :)

于 2014-02-27T07:25:36.243 回答
0

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;
    }
于 2014-02-27T07:33:44.493 回答