Сортировка списка с помощью адаптера массива - PullRequest
28 голосов
/ 28 марта 2012

У меня есть список, подключенный к адаптеру массива. В этом списке показана информация, полученная TCP-соединением, которое изменяет набор данных ...

Я могу отсортировать представление списка с помощью sort (Comparator<? super T> comparator), но при изменении набора данных просмотр списка больше не сортируется ...

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

Как я могу это сделать? Есть предложения?

EDIT

У меня проблемы с реализацией представленных решений ...

MyComparatorB.java

public class MyComparatorB implements Comparator<DeviceB> {

private byte orderType;

public MyComparatorB(byte type) {

    this.orderType = type;

}

public int compare(DeviceB lhs, DeviceB rhs) {

    int res = 0;
    if (orderType == SortType.ALPHA) {
            res = (lhs.getName()).compareTo(rhs.getName());
        }
        else if (orderType == SortType.LAST_ACT) {
            res = (rhs.getTime().getTime()).compareTo(lhs.getTime().getTime());
        }
        return res;
    }

}

Фрагмент моего customArrayAdapter.java

    @Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}


//-----------Order the content of the arrayAdapter------------//
public void sort(byte sortType) {

    super.sort(new MyComparatorB(sortType));
    notifyDataSetChanged();
}

В моем MyActivity.java

myDevAdapter.sort(SortType.ALPHA);

Когда я отлаживаю, вызывается метод super.sort(new MyComparatorB(sortType)); и конструктор MyComparatorB тоже. Но метод compare(DeviceB lhs, DeviceB rhs) никогда не вызывается и мой arrayList не сортируется ... Что я делаю не так?

Ответы [ 7 ]

43 голосов
/ 28 марта 2012

Я думаю, вам нужно переопределить notifyDataSetChanged метод в вашем адаптере и выполнить сортировку прямо перед вызовом его super . Смотрите ниже:

@Override
public void notifyDataSetChanged() {
    //do your sorting here

    super.notifyDataSetChanged();
}

Это приведет к сортировке списка при каждом вызове метода notifyDataSetChanged для обновления элементов списка. В противном случае, отправьте отсортированный список / массив на ваш адаптер.


Или, более предпочтительно, используйте метод sort, доступный в вашем адаптере, чтобы выполнить работу.

adapter.sort(new Comparator<String>() {
    @Override
    public int compare(String lhs, String rhs) {
        return lhs.compareTo(rhs);   //or whatever your sorting algorithm
    }
});
4 голосов
/ 28 марта 2012
  • Сохранение данных в ArrayList
  • Прикрепить массив к адаптеру
  • Сортировать массив и присвоить себе
  • Используйте notifyDataSetChanged () для обновления Адаптера
2 голосов
/ 02 февраля 2015

Это работает для меня

@Override
public void notifyDataSetChanged() {
    this.setNotifyOnChange(false);

    this.sort(new Comparator<String>() {
        @Override
        public int compare(String lhs, String rhs) {
            return lhs.compareTo(rhs);
        }
    });

    this.setNotifyOnChange(true);
}
1 голос
/ 30 марта 2015

Согласно комментарию elBradford относительно возможности переполнения стека в результате подхода notifyDataSetChanged (), я переопределил метод add () ArrayAdapter вместо этого, чтобы гарантировать, что элементы сохраняют отсортированную согласованность при добавлении по одному. (при вызове addAll () я сортирую элементы до; но я думаю, что вы также можете переопределить addAll ()).

    @Override
    public void add(ListThing object) {
        super.add(object);
        this.sort(ListThing.sComparator);
    }
0 голосов
/ 03 июня 2017

Основано на ответах waqaslam и KristianR :

@Override
public void notifyDataSetChanged() {
    this.setNotifyOnChange(false);

    this.sort(new Comparator<String>() {

        @Override
        public int compare(String s1, String s2) {
            return s1.compareTo(s2);
        }
    });

    super.notifyDataSetChanged();
    this.setNotifyOnChange(true);
}

Надеюсь, это поможет.

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

После сортировки listView вызовите adapter.notifyDataSetChanged () из своей деятельности.

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

Поскольку Адаптер заполняет ListView, единственный способ - передать объект данных отсортированным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...