Сортировка ListView по названию продукта с использованием специального адаптера? - PullRequest
7 голосов
/ 18 января 2012

Я хочу отсортировать элементы ListView по названию продукта.У меня есть вектор с именем «data», который является типом класса.

У меня есть класс:

public static class RowData implements Comparable<RowData>{
    public String mProductName;
    protected int mId;

    protected int mOnHand;
    protected double mPrice;
    protected boolean mIsColleaction;
    protected boolean mIsPrePack;

    RowData(int id ,String productName,int onhand,double price,boolean IsColleaction, boolean IsPrePack) {
        mId= id;
        mProductName= productName;
        mOnHand =onhand;
        mPrice = price;
        mIsColleaction =IsColleaction;
        mIsPrePack = IsPrePack;
    }

    @Override
    public String toString() {
        return mProductName;
    }

    public int compareTo(RowData other) {
        return mProductName.compareTo(other.mProductName);
    }

    public static Comparator<RowData> COMPARE_BY_PRODUCTNAME = new Comparator<RowData>() {
        public int compare(RowData one, RowData other) {
            return one.mProductName.compareTo(other.mProductName);
        }
    };
}

, и я взял специальный адаптер, который расширяет ArrayAdapter<RowData>.

Мой код сортировки, который я написал в onCreate(), выглядит следующим образом:

Collections.sort(data, RowData.COMPARE_BY_PRODUCTNAME);
adapter = new CustomAdapter(this, R.layout.list,R.id.title, data);

setListAdapter(adapter);
adapter.notifyDataSetChanged();

Я должен использовать пользовательский адаптер, потому что для отображения цены продукта, а также количества в рукахproduct

данные, являющиеся вектором типа RowData, которые я получаю после отладки в отсортированном порядке имени продукта, которое я хочу, но при привязке к ListView оно не отображается в отсортированном порядке.

Я новичок в Android, пожалуйста, помогите мне.


Спасибо Алекс Локвуд, я использую пользовательский адаптер типа ArrayAdaptor<Class>.

В моем onCreate() методеЯ реализую метод сортировки, как показано ниже,

adapter = new CustomAdapter(this, R.layout.list,R.id.title, data);

adapter.sort(new Comparator<RowData>() {
    public int compare(RowData arg0, RowData arg1) {
        return arg0.mProductName.compareTo(arg1.mProductName);
    }
});

setListAdapter(adapter);

В моем customAdaptor классе я должен переопределить sort следующим образом:

public void sort(Comparator<? super RowData> comparator) {
    // TODO Auto-generated method stub
    super.sort(comparator);
}

Пожалуйста, помогите мне, если можетеизмените приведенный выше код или предложите мне свой код.

Заранее спасибо.

Ответы [ 2 ]

18 голосов
/ 19 января 2012

Если вы используете ArrayAdapter, вы можете позвонить sort на адаптер и передать Comparator.Как вы реализуете Comparator, зависит от вас.


Редактировать I:

Вам не нужно переопределять sort ... theArrayAdapter класс реализует это для вас.Все, что вам нужно сделать, это создать свой собственный Comparator, который будет сортировать объекты универсального типа так, как вы хотите, чтобы они отображались.Кроме того, если вы сортируете список во время выполнения, вам может потребоваться уведомить приложение об изменении набора данных.Ваш код должен работать правильно, если вы используете этот подход.

adapter = new CustomAdapter(this, R.layout.list,R.id.title, data);

adapter.sort(new Comparator<RowData>() {
    public int compare(RowData arg0, RowData arg1) {
        return arg0.mProductName.compareTo(arg1.mProductName);
    }
});

setListAdapter(adapter);
adapter.notifyDataSetChanged();
4 голосов
/ 05 июля 2012

Если вы хотите отсортировать чувствительные к локали строки, используйте класс Collator , например, на немецком языке: A, Ä, B

final Collator col = Collator.getInstance();
adapter.sort(new Comparator<RowData>() {
    public int compare(RowData arg0, RowData arg1) {
       return col.compare(arg0.mProductName, arg1.mProductName);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...