Сортировка ListView SimpleApdater

String[] catNames = getResources().getStringArray(R.array.catNames);
String[] catNames2 = getResources().getStringArray(R.array.catNames2);
String[] catNames3 = getResources().getStringArray(R.array.catNames3);
int[] catNames4 = getResources().getIntArray(R.array.catNames4);
//
ArrayList<HashMap<String, Object>> data = new ArrayList<>(catNames.length);
HashMap<String, Object> map;
for (int i = 0; i < catNames.length; i++) {
    map = new HashMap<>();
    map.put("CatName", catNames[i]);
    map.put("CatName2", catNames2[i]);
    map.put("CatName3", catNames3[i]);
    map.put("CatName4", catNames4[i]);
    data.add(map);
}
//
String[] from = {"CatName", "CatName2", "CatName3", "CatName4"};
int[] to = {R.id.textView1, R.id.textView2, R.id.textView3, R.id.textView4};
//
SimpleAdapter adapter = new SimpleAdapter(TableActivity.this, data, R.layout.list_item, from, to);
listView.setAdapter(adapter);

Как сделать сортировку, например, по catNames.

Arrays.sort(catNames) - сортируется только 1 столбец, а другие нет.

Не хватает знаний на Collections.sort Comparator

Please, help

Решение Ziens - у меня работает, можно сортировать по любому полю textView (и по цифрам и по Info или Desc)

введите сюда описание изображения введите сюда описание изображения


Ответы (1 шт):

Автор решения: Ziens
        CatNames[] names = new CatNames[catNames.length];

        for (int i = 0; i < names.length; i++) {
            names[i] = new CatNames(catNames[i], catNames2[i], catNames3[i]);
        }

        Arrays.sort(names);

        for(CatNames name : names) {
            map = new HashMap<>();
            map.put("CatName", name.name);
            map.put("CatName2", name.name2);
            map.put("CatName3", name.name3);
            data.add(map);
        }

    ...

    static class CatNames implements  Comparable<CatNames> {
        final String name;
        final String name2;
        final String name3;

        CatNames(String name, String name2, String name3) {
            this.name = name;
            this.name2 = name2;
            this.name3 = name3;
        }

        // API level 24 решение:
        @Override
        public int compareTo(CatNames catNames) {
            return Comparator.comparing((CatNames names)-> names.name)
                    .thenComparing(names->names.name2)
                    .thenComparing(names->names.name3)
                    .compare(this, catNames);
        }
        
        // Решение по-проще
        @Override
        public int compareTo(CatNames catNames) {
                int comp = name.compareTo(catNames.name);
                if (comp != 0) return comp;

                comp = name2.compareTo(catNames.name2);
                if (comp != 0) return comp;

                return name3.compareTo(catNames.name3);
        }
    }

P.S. Если правильно понял ваше дополнение в комментарии:

    ...
    Arrays.sort(names); // Прямой порядок

    for (CatNames c : names) {
        System.out.println("Name4=" + c.name4);
    }

    System.out.println("-----------");

    Arrays.sort(names, CatNames::compareReversed); // Обратный

    for (CatNames c : names) {
        System.out.println("Name4=" + c.name4);
    }
    ....



static class CatNames implements Comparable<CatNames> {
    final String name;
    final String name2;
    final String name3;
    final int name4;

    CatNames(String name, String name2, String name3, int name4) {
        this.name = name;
        this.name2 = name2;
        this.name3 = name3;
        this.name4 = name4;
    }

    @Override
    public int compareTo(CatNames catNames) {
        // Сортировка по одному полю
        return Integer.compare(name4, catNames.name4);
    }

    public int compareReversed(CatNames catNames) {
        // Сортировка в обратном порядке
        return compareTo(catNames) * -1;
    }
}
→ Ссылка