【问题标题】:Where to use Comparator to Sort Adapter在哪里使用比较器对适配器进行排序
【发布时间】:2015-03-08 22:02:59
【问题描述】:

我有一个在行中有日期的适配器。当用户更新日期时,我希望根据 object 日期属性中的 UNIX 时间对行进行重新排序。我相信我需要在我的ArrayList<Object> 上使用Comparator 和/或Collections 排序。从this question看到。

我的问题是:当我调用notifyDataSetChanged() 时,ArrayAdapter 中的哪里 需要进行排序吗?或者当我构建它时它会在适配器之外(这对我来说没有意义)?

【问题讨论】:

  • 取决于您的适配器和加载器实现。可以在loadOnBackground(),在你的ContentProvider,在你的ArrayList,......
  • @T 我的ContentProvider 是我的ArrayAdapter。我仍在使用ListView。如果我需要添加更多详细信息,请告诉我。
  • 如果您有对适配器数据的引用,只需在调用通知之前对其进行排序。你提到这没有意义,但是当你的适配器被构造时,它只是指向这个数据,它们是同一个对象。
  • 顺便说一句,当你只有一个项目不合适时,做一个完整的排序是非常低效的。
  • 那么在ArrayAdapter的构造函数中我可以做Collection/Comparator排序吗?

标签: java android collections adapter comparator


【解决方案1】:

在调用 notifyDataSetChanged 之前对适配器的支持数据对象进行排序。

【讨论】:

  • 谢谢。我想我每次调用“通知”时只需要重新创建适配器。只是好奇,为什么你说它效率低下?它只有大约 75 个列表项存储在 SQLite DB 中。我觉得应该没问题。
  • 您不必每次都重新创建适配器,而只需对内部引用的数组/集合进行排序。如果使用引用您的数据结构的自定义适配器,您可以执行一种具有自排序的方法,例如 TreeSet(或者更好的是像这样的 SortedList:blog.scottlogic.com/2010/12/22/sorted_lists_in_java.html) - 请记住,TreeSet 实现具有 Comparator/能够与equals一致。
  • 我只是说,由于您正在处理一个几乎排序的列表,您可以编写一个采用 O(n) 而不是 Collections.sort 的 O(n log n) 的算法跨度>
【解决方案2】:

对于带有代码的答案,请将其放在您的适配器中或您需要进行排序的任何地方:

            adapter.sort(new Comparator<Ledger>() {
                public int compare(MyObject lhs, MyObject rhs) {
                    return  rhs.transaction_date.compareTo(lhs.transaction_date);
                }
            });
            notifyDataSetChanged();

这是我用来让它工作的代码。注意:我想按降序排序,所以我在lhs 之前返回了rhs。此外,这可以保持您的 ListView 位置,这始终是好的。

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2012-09-26
    • 2018-11-25
    相关资源
    最近更新 更多