简体   繁体   English

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

[英]How to sort listview items in descending order

So I have a listview where I wanted to sort the NumberOfRecords in descending order. 所以我有一个listview,我想按降序排序NumberOfRecords。 I have a custom array adapter but I called my sorting class before I place a data in my ArrayList, this my Asynctask receiving JSON: 我有一个自定义数组适配器,但我在将数据放入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);
    }
}

And here's my sorting class: 这是我的排序类:

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

} }

But the result I'm getting is: 但我得到的结果是:

5
15
14
0
0

Is my sorting implementation wrong? 我的排序实现错了吗? Or should I parse it to Integer before return? 或者我应该在返回之前将其解析为Integer?

You can use the following code to sort your integer list is descending order.Here we are overriding compare() so that it sorts in descending order. 您可以使用以下代码对整数列表进行降序排序。这里我们重写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;
                     } 
                   }
            });

Hope it helps. 希望能帮助到你。

Okay, so I solved this by replacing the: 好的,所以我通过替换:

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

to: 至:

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

So the simple compare of an integer in a String data type would not result correctly but to parse the string first by: 因此,String数据类型中的整数的简单比较不会正确结果,而是先解析字符串:

Integer.parseInt(string)

and get the true value of the number string. 并获得数字字符串的真值。

Try with this Comparator. 试试这个比较器。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM