如何按降序对列表视图项进行排序

Posted

技术标签:

【中文标题】如何按降序对列表视图项进行排序【英文标题】:How to sort listview items in descending order 【发布时间】:2013-08-13 19:04:38 【问题描述】:

所以我有一个列表视图,我想在其中按降序对 NumberOfRecords 进行排序。我有一个自定义数组适配器,但我在将数据放入 ArrayList 之前调用了排序类,这是我的 Asynctask 接收 JSON:

public class SampleListTask extends AsyncTask<String, Void, String> 

    public ProgressDialog pDialog;

    @Override
    protected void onPreExecute() 
        super.onPreExecute();

        pDialog = new ProgressDialog(SampleActivity.this);
        pDialog.setMessage("Loading...");
        pDialog.setCancelable(false);
        pDialog.show();
    

    @Override
    protected String doInBackground(String... path) 
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

        Log.d(Constant.TAG_RANKING, path[0]);
        String apiRequestReturn = UtilWebService.getRequest(path[0]);
        if (apiRequestReturn.equals("")) 
            Log.d(Constant.TAG_SAMPLE, "WebService request is null");
            return null;
         else 
            Log.d(Constant.TAG_SAMPLE, "WebService request has data");
            return apiRequestReturn;
        
    

    @Override
    protected void onPostExecute(String result) 
        super.onPostExecute(result);

        if (null != pDialog && pDialog.isShowing()) 
            pDialog.dismiss();
        

        if (null == result || result.length() == 0) 
            application.shortToast("No data found from server");
         else 
            try 
                JSONObject sampleObject = new JSONObject(result);
                JSONArray jsonArray = sampleObject
                        .getJSONArray(Constant.TAG_SAMPLE);

                for (int i = 0; i < jsonArray.length(); i++) 
                    JSONObject objJson = jsonArray.getJSONObject(i);

                    sample = new ArraySample();

                    sample.setId(objJson.getInt(Constant.TAG_SONGID));
                    sample.setThumbUrl(objJson
                            .getString(Constant.TAG_IMAGEURL));
                    sample.setTitle(objJson
                            .getString(Constant.TAG_NAME));
                    sample.setArtist(objJson
                            .getString(Constant.TAG_ARTIST));
                    sample.setDuration(Utility
                            .changeStringTimeFormat(objJson
                                    .getString(Constant.TAG_MUSICLENGTH)));
                    sample.setNumberOfRecords(objJson
                            .getString(Constant.TAG_NUMBEROFRECORDS));

                    Collections.sort(sampleList, new SortByRecordNumber()); // This where I call the class
                    sampleList.add(sample);
                
             catch (JSONException e) 
                e.printStackTrace();
            
            setAdapterToListview();
        
    

    public void setAdapterToListview() 
        objRowAdapter = new RowAdapterSample(getApplicationContext(),
                R.layout.item_sample, sampleList);
        sampleListView.setAdapter(objRowAdapter);
    

这是我的排序类:

public class SortByRecordNumber implements Comparator 

public int compare(Object o1, Object o2) 
    ArraySample p1 = (ArraySample) o1;
    ArraySample p2 = (ArraySample) o2;

    return p2.getNumberOfRecords().compareTo(p1.getNumberOfRecords());

但我得到的结果是:

5
15
14
0
0

我的排序实现错了吗?还是应该在返回之前将其解析为 Integer?

【问题讨论】:

java comparator, how to sort by integer? 的可能重复项 谢谢,有类似的解决方案。 【参考方案1】:

您可以使用以下代码对整数列表进行降序排序。这里我们重写 compare() 使其按降序排序。

//sort list in desc order 
            Collections.sort(myIntegerList, new Comparator<Integer>() 
                public int compare(Integer one, Integer other) 
                     if (one >= other) 
                         return -1;
                      else 
                         return 1;
                      
                   
            );

希望对您有所帮助。

【讨论】:

非常感谢!正如我自己发布的那样,这也解决了我的问题。 +1 为另一个解决方案而不创建任何类【参考方案2】:

试试这个比较器。

Comparator objComparator = new Comparator() 
    public int compare(Object o1, Object o2) 
        int no1 = Integer.parseInt((String) o1);
        int no2 = Integer.parseInt((String) o2);
        return  no1 < no2 ? -1 : no1 == no2 ? 0 : 1;
    
;
Collections.sort(myIntegerList, objComparator);

【讨论】:

谢谢!这也有效,我将return no1 &lt; no2 ? -1 : no1 == no2 ? 0 : 1; 倒转为return no2 &lt; no1 ? -1 : no1 == no2 ? 0 : 1; 以进行降序。【参考方案3】:

好的,所以我通过替换解决了这个问题:

p2.getNumberOfRecords().compareTo(p1.getNumberOfRecords())

到:

(int) Integer.parseInt(p2.getNumberOfRecords()) - Integer.parseInt(p1.getNumberOfRecords())

因此,String 数据类型中整数的简单比较不会正确结果,而是首先通过以下方式解析字符串:

Integer.parseInt(string)

并获取数字字符串的真实值。

【讨论】:

以上是关于如何按降序对列表视图项进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按降序对单链表进行排序

如何按降序对 ListView.builder 进行排序?

如何在Ruby中按降序对数组进行排序

如何按降序对 JSON 数组元素进行排序? [复制]

如何根据特定值按降序对数组进行排序[重复]

如何按降序对 ArrayList<Long> 进行排序?