#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
...
}
}