Подтвердить что ты не робот

Сортировка списка с адаптером массива

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

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

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

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

ИЗМЕНИТЬ

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

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) никогда не вызывается, и мой массивList не сортируется... Что я делаю неправильно?

4b9b3361

Ответ 1

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

@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
    }
});

Ответ 2

  • Сохранение данных в ArrayList
  • Прикрепить массив к адаптеру
  • Сортировка массива и назначение ему
  • Используйте notifyDataSetChanged() для обновления адаптера

Ответ 3

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

@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);
}

Ответ 4

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

Ответ 5

После сортировки listView вызовите из вашей активности адаптер .notifyDataSetChanged().

Ответ 6

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

    @Override
    public void add(ListThing object) {
        super.add(object);
        this.sort(ListThing.sComparator);
    }

Ответ 7

На основе 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);
}

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