如何在给定的Android代码中按时间对ListView进行排序?
当然可以实现!
你的需求是让ListView里的时间按从早到晚排序(比如19:15排在20:30前面),基于你给出的代码片段,我们可以根据时间字符串的格式选择对应的实现方式:
情况1:时间字符串是标准的HH:mm格式(24小时制,两位小时+两位分钟)
这种情况下直接用Collections.sort()就完全够用!因为HH:mm格式的字符串字典序和时间顺序完全一致(比如"19:15"的字符顺序比"20:30"小,排序后自然会排在前面)。
你可以直接完善现有代码:
@Override public void onDataChange(DataSnapshot dataSnapshot) { List<String> listTime = new ArrayList<String>(); // 先从DataSnapshot里把时间数据填充到listTime中 for (DataSnapshot snapshot : dataSnapshot.getChildren()) { String time = snapshot.getValue(String.class); listTime.add(time); } // 默认排序即可实现时间从早到晚 Collections.sort(listTime); // 初始化ArrayAdapter并绑定排序后的时间列表 ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, listTime); // 把adapter设置给你的ListView yourListView.setAdapter(adapter); }
情况2:时间字符串不是标准HH:mm格式(比如12小时制带AM/PM、小时是一位数等)
如果你的时间格式是7:15 PM、9:30 AM这类,默认字符串排序就会出错,这时候需要自定义一个Comparator,把字符串转换成时间对象再比较:
方案1(Java 8+ / Android API 26+):用LocalTime解析
@Override public void onDataChange(DataSnapshot dataSnapshot) { List<String> listTime = new ArrayList<String>(); // 先填充时间数据 for (DataSnapshot snapshot : dataSnapshot.getChildren()) { String time = snapshot.getValue(String.class); listTime.add(time); } // 自定义比较器,这里假设时间格式是"hh:mm a"(比如"07:15 PM") Collections.sort(listTime, new Comparator<String>() { @Override public int compare(String time1, String time2) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a"); LocalTime t1 = LocalTime.parse(time1, formatter); LocalTime t2 = LocalTime.parse(time2, formatter); return t1.compareTo(t2); } }); // 绑定adapter到ListView ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, listTime); yourListView.setAdapter(adapter); }
方案2(兼容低版本Android):用SimpleDateFormat解析
@Override public void onDataChange(DataSnapshot dataSnapshot) { List<String> listTime = new ArrayList<String>(); // 先填充时间数据 for (DataSnapshot snapshot : dataSnapshot.getChildren()) { String time = snapshot.getValue(String.class); listTime.add(time); } // 自定义比较器 Collections.sort(listTime, new Comparator<String>() { @Override public int compare(String time1, String time2) { SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a", Locale.US); try { Date dt1 = sdf.parse(time1); Date dt2 = sdf.parse(time2); return dt1.compareTo(dt2); } catch (ParseException e) { e.printStackTrace(); return 0; } } }); // 绑定adapter到ListView ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, listTime); yourListView.setAdapter(adapter); }
最后要注意:一定要确保listTime在排序前已经正确填充了从DataSnapshot获取的时间数据,再把排序后的列表传给ArrayAdapter,就能实现ListView按时间从早到晚排序啦!
内容的提问来源于stack exchange,提问作者bwen
相关产品推荐
相关产品推荐

