2014-09-06 57 views
0

我有一个ListView,它显示时间和日期以及与该问题无关的其他信息。它们存储在ArrayList Hashmap中。当加载到ListView中时,它们默认由那里的ID组织,相反,它们需要按日期和时间组织。这是我的代码到目前为止。ArrayList <HashMap <String,Object>按ListView单元格的键值排序

public void loadListView() { 
    productsList = new ArrayList<HashMap<String, Object>>(); 
    lv = (ListView) getActivity().findViewById(R.id.listview); 
    lv.setTextFilterEnabled(true); 
    DatabaseHandler db = new DatabaseHandler(getActivity()); 
    List<SalesCall> salescall = db.getAllSalescalls(); 
    lv = (ListView) getActivity().findViewById(R.id.listview); 
    for (SalesCall cn : salescall) { 
     HashMap<String, Object> map = new HashMap<String, Object>(); 
     map.put(KEY_ID, cn.getID()); 
     map.put(KEY_NAME, cn.getDoctor()); 
     map.put(KEY_TIME, cn.getScheduled_time()); 
     map.put(KEY_DATE, cn.getScheduled_Date()); 
     map.put(KEY_ALL, cn.getAccount() + ":" + cn.getDoctor()); 
     productsList.add(map); 

    } 

    adapter = new ExtendedSimpleAdapter(
      getActivity(), productsList, 
      R.layout.listview_item_layout_salescall, 
      new String[]{KEY_ID, KEY_NAME, KEY_TIME, KEY_DATE, KEY_ALL}, 
      new int[]{R.id.id, R.id.fname, R.id.Time, R.id.Date, R.id.All}); 
    // updating listview 

    lv.setAdapter(adapter); 
    db.close(); 
} 

我该如何对数据进行排序呢?

编辑: 可比代码

@Override 
     public int compare(SalesCall lhs, SalesCall rhs) { 
     if (lhs.getScheduled_Date() == null || rhs.getScheduled_Date() == null) 
      return 0; 
     return lhs.getScheduled_Date().compareTo(rhs.getScheduled_Date()); 
    } 

回答

1

的HashMap的实现不提供的项目的任何命令。 ArrayList保持添加数据的顺序。你应该改变你的流程以达到你所期望的结果。

这是你需要有流动:

  1. 采集数据的有效为了
  2. 创建映射
  3. 显示

在你的代码使用方法

List<SalesCall> salescall = db.getAllSalescalls();

如果已提供在要求为了这个数据,那么你不会有当你穿越名单给他们映射之前排序

List<SalesCall> salesCallByDate = db.getSalesCallsAndSortBy(R.id.Date, R.id.Time);

然后和创建映射到存储在新列表地图的订货会保持。

+0

这是一个很好的解决方案,从来没有真正这样想过。我感到很傻很简单。谢谢。 – M0NKEYRASH 2014-09-07 19:11:50

0

HashMap不会受到密钥对数据进行排序。可能你正在寻找TreeMap

但是在审查了更多的代码后,你做错了。最好使用List<SalesCall>而不是List<Map<String, String>>来传递数据。可能你需要SalesCall类实现Comparable相应的排序,如果它将从不同的意图传递,它可能还需要实现Serializable

实施Comparable Basic示例:

public SalesCall implements Comparable<SalesCall> { 
    @Override 
    public int compareTo(SalesCall another) { 
     /* algoritm to sort by Date and Time fields */ 
    } 
} 
+0

对不起,忘了提及,SalesCall实际上是一个数据库加载数据库的类。 – M0NKEYRASH 2014-09-06 21:11:03

+0

@ M0NKEYRASH和重复使用该类的问题是......好吧,如果你不能修改它,只需提供一个自定义的'Comparator':'public class SalesCallDateComparator implements Comparator {/ * * /}' – 2014-09-06 21:13:37

+0

好吧,我管理好了修改原始类没有任何错误。我实现了一个比较器,只比较当前的日期。它看起来像这样(检查编辑)我仍然不明白它如何检查日期,然后告诉列表视图它应该按照这个顺序。我认为我没有正确实施它。 – M0NKEYRASH 2014-09-07 04:20:34

相关问题