SectionIndexer — использование с ArrayAdapter и CustomObject?

Я следую отличному примеру кодирования здесь: Этот SO вопрос. Речь идет о реализации интерфейса SectionIndexer для адаптера массива.

Однако как бы вы сделали то же самое, если ваш ArrayAdapter передает ArrayList‹ MyObject > не ArrayList‹ String >?

Например, здесь мой код отличается от его кода. У него есть:

class AlphabeticalAdapter extends ArrayAdapter<String> implements SectionIndexer {
private HashMap<String, Integer> alphaIndexer;
private String[] sections;

public AlphabeticalAdapter(Context c, int resource, List<String> data) {

    alphaIndexer = new HashMap<String, Integer>();
    for (int i = 0; i < data.size(); i++) {
        String s = data.get(i).substring(0, 1).toUpperCase();
        alphaIndexer.put(s, i);
    }

    // other stuff

 }

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

 public class CustomAdapter extends ArrayAdapter<Items> implements
    SectionIndexer {

     public ItemAdapter(Context context, Items[] objects) {

Там, где он передает один ArrayList, я должен передать три, но чтобы это произошло, мне пришлось обернуть его в пользовательский класс объектов. Один из ArrayList, которые я хочу отсортировать, является одним из трех полей в классе с именем «имя». Очевидно, это строка.

Я хочу прокрутить это в алфавитном порядке с помощью SectionIndex на основе этого поля имени. Как изменить пример кода из другого вопроса, чтобы он работал в этом сценарии?

Где у него "data.size()", мне нужно что-то вроде "name.size()" - я думаю?


person TheLettuceMaster    schedule 25.07.2012    source источник


Ответы (1)


Там, где он передает один ArrayList, я должен передать три, но чтобы это произошло, мне пришлось обернуть его в пользовательский класс объектов. Один из ArrayList, которые я хочу отсортировать, является одним из трех полей в классе с именем «имя».

У вас нет трех ArrayLists, у вас есть ArrayList пользовательских объектов, которые были созданы из трех ArrayLists (поэтому размер равен размеру List, который вы передаете адаптеру). С этой точки зрения единственным изменением в вашем коде является использование имени из этого пользовательского объекта Items для создания разделов:

for (int i = 0; i < data.size(); i++) {
    String s = data.get(i).name.substring(0, 1).toUpperCase();
    if (!alphaIndexer.containsKey(s)) {
        alphaIndexer.put(s, i);
    }
}
// ...

Других изменений нет. Также вам может понадобиться отсортировать List из Items, которые вы передаете адаптеру, используя:

Collections.sort(mData);

где ваш класс Items должен реализовать интерфейс Comparable<Items>:

    class Items implements Comparable<Items> {
        String name;
        // ... rest of the code

        @Override
        public int compareTo(Items another) {   
            // I assume that you want to sort the data after the name field of the Items class
            return name.compareToIgnoreCase(another.name);
        }

    }
person user    schedule 25.07.2012
comment
Эй, спасибо! Я отредактировал свой код, показав еще одну часть, которую должен был включить. Я добавил конструктор моего адаптера. На самом деле я передаю массив объектов, а не ArrayLists, что, как я полагаю, снова изменяет цикл for? - person TheLettuceMaster; 25.07.2012
comment
@KickingLettuce Единственное изменение — это синтаксис для получения размера данных, вместо data.size() вы должны использовать data.length, потому что используете массив. - person user; 25.07.2012
comment
Еще раз спасибо. Я понял это с помощью Eclipse. Однако он не дал мне никаких рекомендаций по этому поводу: «data.get(i).name.substring(0, 1)». Это была единственная ошибка, которую я получал. Я полагал, что это будут data[i].name.substring(0,1), но я думаю, что у него тоже есть проблема. - person TheLettuceMaster; 25.07.2012
comment
@KickingLettuce Да, я забыл об этом. Это должно быть (просто посмотреть) Items it = data[i]; String name = it.name; String section = name.substring(0, 1).toUpperCase();// .... Вы получаете какие-либо ошибки? - person user; 25.07.2012
comment
Я попробую это позже сегодня вечером и вернусь к вам. Спасибо! Мне он кажется солидным. Я отмечу правильно, как только у меня это заработает, а пока я всем +1. - person TheLettuceMaster; 26.07.2012
comment
У меня была такая же проблема, ваш ответ помог. мне пришлось реализовать в уже созданном пользовательском адаптере, и этот кусок кода очень помог. Благодарность!! - person Reshma; 15.12.2014