2013-03-01 37 views
1

我有一些JSON數據從服務器上拉下來。該數據中的一個字段是距離值。我需要按ListView中從最低到最高的距離排序數據。我不知道如何去做這件事?Android:如何對ListView的數據進行排序?

任何幫助表示讚賞。

這是我的代碼抓取數據不知道如何讓它正確排序嗎?

// Hashmap for ListView 
ArrayList<HashMap<String, String>> bathroomList = new ArrayList<HashMap<String, String>>(); 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
    setContentView(R.layout.activity_search); 
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title); 

    // Creating JSON Parser instance 
    JSONParser jParser = new JSONParser(); 

    // getting JSON string from URL 
    JSONObject json = jParser.getJSONFromUrl(url); 

    try { 
     // Getting Array of Contacts 
     bathrooms = json.getJSONArray(TAG_BATHROOMS); 

     // looping through All Contacts 
     for(int i = 0; i < bathrooms.length(); i++){ 
      JSONObject c = bathrooms.getJSONObject(i); 


      // Storing each json item in variable 
      String id = c.getString(TAG_ID); 
      String access = c.getString(TAG_ACCESS); 
      String city = c.getString(TAG_CITY); 
      String comment = c.getString(TAG_COMMENT); 
      String directions = c.getString(TAG_DIRECTIONS); 
      String name = c.getString(TAG_NAME); 
      String street = c.getString(TAG_STREET); 
      String bathroomtype = c.getString(TAG_BATHROOMTYPE);     
      String distance = c.getString(TAG_DISTANCE); 
      String distanceTrimmed = distance.substring(0,4) + " " + "miles away"; 
      String avail = c.getString(TAG_AVAIL); 
      String country = c.getString(TAG_COUNTRY); 
      String state = c.getString(TAG_STATE); 
      String postal = c.getString(TAG_POSTAL); 

      //System.out.println(name); 

      // creating new HashMap 
      HashMap<String, String> map = new HashMap<String, String>(); 

      // adding each child node to HashMap key => value 
      map.put(TAG_ID, id); 
      map.put(TAG_ACCESS, access); 
      map.put(TAG_CITY, city); 
      map.put(TAG_COMMENT, comment); 
      map.put(TAG_DIRECTIONS, directions); 
      map.put(TAG_NAME, name); 
      map.put(TAG_STREET, street); 
      map.put(TAG_BATHROOMTYPE, bathroomtype); 
      map.put(TAG_DISTANCE, distanceTrimmed); 
      map.put(TAG_AVAIL, avail); 
      map.put(TAG_COUNTRY, country); 
      map.put(TAG_STATE, state); 
      map.put(TAG_POSTAL, postal); 

      // adding HashList to ArrayList 
      bathroomList.add(map); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 


    /** 
    * Updating parsed JSON data into ListView 
    * */ 

    ListAdapter adapter = new SimpleAdapter(this, bathroomList, 
      R.layout.list_item, 
      new String[] { TAG_ID, TAG_NAME, TAG_STREET, TAG_CITY, TAG_STATE, TAG_POSTAL,TAG_COUNTRY, TAG_DISTANCE, TAG_DIRECTIONS, TAG_COMMENT, TAG_AVAIL, TAG_BATHROOMTYPE, TAG_ACCESS}, new int[] { 
        R.id.key,R.id.name, R.id.street, R.id.city, R.id.state, R.id.postal,R.id.country, R.id.distance, R.id.directions, R.id.comments, R.id.availability, R.id.bathroomtype, R.id.access }); 

    setListAdapter(adapter); 
+1

考慮使用自定義的比較:http://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/ – kcoppock 2013-03-01 03:33:13

+1

此外,我建議只爲您的數據寫一個類,而不是使用Map。在我看來,並不是真正的正確結構。 – kcoppock 2013-03-01 03:36:17

+0

我可以知道這裏的浴室是什麼。 – Gunaseelan 2013-03-01 04:45:21

回答

4

排序使用Collections.sort() with a custom comparator.

Collections.sort(bathroomList, new Comparator<HashMap<String, String>>() 
{ 
    @Override 
    public int compare(HashMap<String, String> a, HashMap<String, String> b) 
    { 
     return a.get(TAG_DISTANCE).compareTo(b.get(TAG_DISTANCE)); 
    } 
}); 
+0

距離以字符串形式出現,但應使用其數值進行比較。此代碼是否仍然有效? – 2013-03-01 04:13:55

+0

不需要。爲此,您需要將字符串解析爲數字。 http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String)或http://docs.oracle.com/javase/7/docs /api/java/lang/Double.html#parseDouble(java.lang.String)。正如@ kcoppock所評論的那樣,你應該真的把你的數據存儲在一個類中;這樣你實際上可以存儲正確類型的字段(不僅僅是字符串)。作爲獎勵,你甚至可以讓類實現[Comparable](http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html),然後你就不需要自定義比較器。 – 2013-03-01 04:23:57

+0

請參閱http://c2.com/cgi/wiki?StringlyTyped和http://www.codinghorror.com/blog/2012/07/new-programming-jargon.html。順便說一句,既然你使用的是JSON,我懷疑數據實際上不是作爲一個字符串來傳遞,而是作爲一個數字(在JSON中),你的代碼只是很差地解析它。 – 2013-03-01 04:26:23

2

同樣的問題與我的列表中,但我已經把它現在的工作,感謝@rusmus。看看Sorting Double Data (distance) on ListView

試試這個代碼:

Collections.sort(bathroomList, new Comparator<HashMap<String, String>>() { 

        @Override 
        public int compare(HashMap<String, String> o1, 
          HashMap<String, String> o2) {       
         return Double.compare(Double.parseDouble(o1.get(TAG_DISTANCE)), Double.parseDouble(o2.get(TAG_DISTANCE))); // error 
        }     
       }); 
相關問題