Compaq LE2202x
Compaq LE2202x

Reputation: 2386

How to sort listview items in descending order

So I have a listview where I wanted to sort the NumberOfRecords in descending order. 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:

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?

Upvotes: 2

Views: 21472

Answers (3)

Compaq LE2202x
Compaq LE2202x

Reputation: 2386

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:

Integer.parseInt(string)

and get the true value of the number string.

Upvotes: 2

SilentKiller
SilentKiller

Reputation: 6942

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

Upvotes: 2

Rachita Nanda
Rachita Nanda

Reputation: 4659

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.

//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.

Upvotes: 6

Related Questions