Как указать порядок сортировки для детей в расширяемом списке? - PullRequest
4 голосов
/ 19 марта 2012

Я работаю над приложением для конференций, в котором мы хотим, чтобы сессии сначала группировались по времени, а затем по местоположению комнаты.Я успешно отсортировал по одному или другому в моей ExpandableListActivity, но безуспешно с первичной и вторичной сортировкой.

приложение конференции, которое отображает сеансы, сначала сгруппированные по времени, а затем по местоположению комнаты 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 ]

1 голос
/ 23 марта 2012

Оказывается, что в классе был компаратор, который переопределял порядок сортировки, указанный в предложении 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());
    }
};
0 голосов
/ 23 марта 2012

это не совсем ответ, но я пока не могу писать комментарии.Строка SORT_ORDER должна быть правильной.Но вы можете попробовать использовать оболочку и выполнить запрос sql lite напрямую, чтобы вы могли сузить проблему.

  1. Запустите эмулятор с приложением
  2. в консоли.введите:

    adb shell

  3. теперь перейдите в каталог вашего приложения;например:

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

  4. запустить командную строку SQLLiteвведите:

    sqlite3 <имя файла>

  5. Если вы не знаете имя файла вашей базы данных, просто введите "ls", смотритевсе файлы в этом каталоге.

  6. Теперь вы можете ввести свой запрос.Например:

SELECT * ИЗ временных интервалов, местоположений ORDER BY timeslots.timestart, location.name;

ссылка: http://www.sqlite.org/sqlite.html

0 голосов
/ 23 марта 2012

Просто поместите данные в ArrayAdapter, отсортируйте их так, как вам нужно, и затем верните адаптер в список активности.

...