Android: удаление «The» из элементов listview

#android #listview

#Android #listview

Вопрос:

Я получил несколько запросов на настройку способа отображения элементов списка в моем приложении media Player.

В настоящее время любая запись, начинающаяся с «The», сортируется с помощью T, как и следовало ожидать. Многие пользователи хотели бы отсортировать элемент, используя второе слово в названии.

Может кто-нибудь пролить свет на то, где это можно было бы сделать? Будет ли это скорректировано при получении курсора или при применении к listview?

Буду признателен за любую помощь.

Спасибо, Джош

Обновить:

Спасибо всем за ответы, но я все еще пытаюсь найти применение решениям, предложенным в моем примере.

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

 audioCursor = getContentResolver().query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, cols, 
            null, null,AudioColumns.ARTIST   " COLLATE LOCALIZED ASC");
        startManagingCursor(audioCursor);        


        setListAdapter(new MyABCAdapter(this, R.layout.list_item,
                audioCursor, new String[]{AudioColumns.ARTIST,MediaStore.Audio.Artists.NUMBER_OF_TRACKS}, 
                new int[]{android.R.id.text1, android.R.id.text2}));
  

У меня также есть утилита, которая успешно корректирует текст записи, изменяя «Исполнитель» на «Исполнитель, The», но она не применяется до тех пор, пока BindView и список не будут уже отсортированы:

 private String fixFileName(String fileName) {
    ...
    if (fileName.startsWith("The")){

        fileName = fileName.replace("The ", "");
        fileName = fileName.concat(",The");
    }


    return fileName;
}
  

Мои вопросы:

1) Есть ли какой-либо способ применить fixFileName к курсору до создания списка? 2) Если это невозможно, есть ли способ использовать listview после bindview?

Спасибо!

Ответ №1:

Пусть ваши элементы списка будут сопоставимы. В compareTo(..) методе напишите пользовательский код сравнения, вероятно, используя "the".equalsIgnoreCase(fileName.subString(0, 3)) , чтобы сделать «The …» особым случаем.

Ответ №2:

Используете ли вы ArrayList<String> для заголовков? Один из способов, который я могу придумать, — это реализовать ваш собственный Comparable интерфейс. Это включало бы, внутри метода compareTo(...) , удаление любого слова, такого как «The», «A» и т.д. И возврат сравнения остальной части строки.

Ответ №3:

При добавлении элементов в список выполните Collections.sort() с помощью пользовательского компаратора.

 class CustomComp implements Comparator
{
    public int compare(Object obj1, Object obj2)
    {
        ...
        if(obj1.toString().toLowerCase().startsWith("the"))
             sort by second word instead
        ...
    }
}