Сортировка 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;
}
}

