I'm new on android programming, and still learning about its concept, I'm currently building an app that will get some data from online database and stored it in ArrayList> Type, then I will show the data,
I've successfully get the data from database and successfully showed it on ListView as well,, and now I want to sort the data based on its date (there is one date value stored in the hashmap),
I've read how to do it in these question :
How to sort data of ArrayList of hashmap on The Basis of Date
I don't really get the concept and still have no idea how it could be worked with my current code. Hope you could help me with my code,
This is my code :
public class Notification extends Activity {
userSessionManager session;
String Username, clickedId, clickedTitle, toastMessage;
String urlUpdateGroupConfirmation, urlGetNotif;
JSONParser jsonParser;
ProgressDialog pd;
JSONArray jsonArray = null;
private ArrayList<HashMap<String, String>> whatsNew;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.notification);
getActionBar().setDisplayShowHomeEnabled(false);
sessionAndDeclaration();
new AttemptParseNotification().execute();
}
private void sessionAndDeclaration() {
// TODO Auto-generated method stub
session = new userSessionManager(getApplicationContext());
HashMap<String, String> user = session.getUserDetails();
Username = user.get(userSessionManager.KEY_USERNAME);
myIP ip = new myIP();
String publicIp = ip.getIp();
String thisPhp = "viewMyNotification.php";
String updateGConf = "doUpdateGroupDetail.php";
urlGetNotif = publicIp + thisPhp;
urlUpdateGroupConfirmation = publicIp + updateGConf;
jsonParser = new JSONParser();
whatsNew = new ArrayList<HashMap<String, String>>();
}
class myMapComparator implements Comparator<Map<String, String>> {
@Override
public int compare(Map<String, String> lhs, Map<String, String> rhs) {
// TODO Auto-generated method stub
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return df.parse(lhs.get("date")).compareTo(
df.parse(rhs.get("date")));
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}
}
class AttemptParseNotification extends AsyncTask<Void, Void, Boolean> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd = new ProgressDialog(Notification.this);
pd.setIndeterminate(false);
pd.setCancelable(true);
pd.setMessage("Loading...");
pd.show();
}
@Override
protected Boolean doInBackground(Void... arg0) {
// TODO Auto-generated method stub
int success = 0;
try {
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("Username", Username));
Log.d("Request!", "Passing Username to server");
JSONObject json = jsonParser.makeHttpRequest(urlGetNotif,
"POST", params);
success = json.getInt("success");
if (success == 1) {
Log.d("Response", "Getting todays");
jsonArray = json.getJSONArray("array");
try {
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject c = jsonArray.getJSONObject(i);
String newId = c.getString("id");
String newType = c.getString("type");
String newTitle = c.getString("title");
String newDisplayed = newTitle + "(" + newType
+ ")";
String newDate = c.getString("date");
HashMap<String, String> map = new HashMap<String, String>();
map.put("id", newId);
map.put("title", newTitle);
map.put("date", newDate);
map.put("type", newType);
map.put("displayed", newDisplayed);
whatsNew.add(map);
Collections.sort(whatsNew, new myMapComparator());
}
} catch (JSONException e) {
e.printStackTrace();
}
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Boolean result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
pd.dismiss();
if (whatsNew.size() > 0) {
viewNews();
} else {
Toast.makeText(getBaseContext(), "No new notification",
Toast.LENGTH_LONG).show();
}
}
}
public void viewNews() {
// TODO Auto-generated method stub
ListView lv = (ListView) findViewById(R.id.lv_notif);
ListAdapter adapter = new SimpleAdapter(this, whatsNew,
R.layout.notificationlist_item, new String[] { "title", "type",
"date" }, new int[] { R.id.title_notif,
R.id.type_notif, R.id.date_notif });
lv.setAdapter(adapter);
}
}
2 Answers 2
As I suggested to use TreeSet
instead of Collections.sort
,
here is the rough example,
public static Set<HashMap<String, String>> mySet = new TreeSet<>(new Comparator<HashMap<String, String>>() {
@Override
public int compare(HashMap<String, String> o1, HashMap<String, String> o2) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return df.parse(o1.get("date")).compareTo(
df.parse(o2.get("date")));
} catch (ParseException e) {
throw new IllegalArgumentException(e);
} }
});
The difference b/w Collections.sort
and TreeSet
is that a TreeSet
keeps your data sorted at all times while the Collections.sort()
method sorts it when you call the method on your Set.
for example, if you add data in it, i.e, mySet.add(yourData);
, it will be added in sorted order.
Comments
After the loop that adds all of the data to the "whatsNew" list, you need to call your comparator to sort the list.
Add this line to "doInBackground" before "return null"...
Collections.sort(whatsNew, new myMapComparator());
(side note: as you may already know, in Java the convention is to start a class name with a capital letter)
ArrayList
, useTreeSet
it will keep your datetime object sorted at all time.