如何在可扩展列表中指定子项的排序顺序?

时间:2012-03-19 19:45:10

标签: android android-contentprovider

我正在开发一个会议应用程序,我们希望会话首先按时间分组,然后按房间位置分组。我已经成功地在我的ExpandableListActivity中按一个或另一个排序,但是对主要和次要排序都没有成功。

conference application that displays the sessions first grouped by time and then by room location http://coreylatislaw.com/wp-content/uploads/2012/03/sort-issue.png

设置

  • 自定义内容提供商(扩展ContentProvider)
  • 自定义列表适配器(扩展BaseExpandableListAdapter)
  • 自定义列表活动(扩展ExpandableListActivity)

查询

    Cursor cursor = context.getContentResolver()
                           .query(uri,
                                  ScheduleData.PROJECTION,
                                  null,
                                  null,
                                  ScheduleData.SORT_ORDER);

排序顺序

    public static final String SORT_ORDER = TimeSlots.QUALIFIED_TIMESTART + " ASC"; // timeslots.timestart

失败的主要&二级排序

    public static final String SORT_ORDER = TimeSlots.QUALIFIED_TIMESTART + " ASC, " + Locations.QUALIFIED_NAME + " ASC"; // timeslots.timestart ASC, locations.name ASC
    public static final String SORT_ORDER = TimeSlots.QUALIFIED_TIMESTART + ", " + Locations.QUALIFIED_NAME + " ASC";     // timeslots.timestart, locations.name ASC

第二个条款似乎对订购没有影响。这是ExpandableListActivity的限制吗?我应该以不同方式指定多个排序顺序项吗?

3 个答案:

答案 0 :(得分:1)

事实证明,类中有一个比较器覆盖了ORDERBY子句中指定的排序顺序。当使用上面的ORDERBY子句而没有比较器时,我得到了所需的排序。你可以这样做,但是我要删除额外的代码并选择ORDERBY子句。

比较器路径:

// Sort children
Collections.sort(group.children, CHILD_COMPARATOR);

// Specify sort by location
static final Comparator<Child> CHILD_COMPARATOR = new Comparator<Child>()
{
    @Override
    public int compare (Child child1, Child child2)
    {
        return child1.location.toLowerCase().compareTo(child2.location.toLowerCase());
    }
};

答案 1 :(得分:0)

只需将数据放入'ArrayAdapter',按照您想要的方式对其进行排序,然后将适配器设置回活动列表。

答案 2 :(得分:0)

这不是一个真正的答案,但我还不能写评论。 SORT_ORDER字符串应该是正确的。 但是您可以尝试使用shell并直接执行sql lite查询,以便缩小问题范围。

  1. 使用您的应用启动模拟器
  2. 控制台类型中的
  3.   

    adb shell

  4.   
  5. 现在导航到您应用的目录;例如:

      

    cd /data/data/com.myapp/databases)

  6. 键入以下命令启动SQLLite命令行工具:

      

    sqlite3&lt;文件名&gt;

  7. 如果您不知道数据库文件的名称,只需输入“ls”即可查看此目录中的所有文件。

  8. 您现在可以输入您的查询。例如:
  9.   

    SELECT * FROM timeslots,locations ORDER BY timeslots.timestart,locations.name;

    参考: http://www.sqlite.org/sqlite.html