Как отсортировать два разных массива в RecyclerView?
У меня есть 5 элементов в RecyclerView (элементы, взяты из базы данных) с датами и текстами. Два разных списка. Для дат и для строк. Один фрагмент содержит 1 дату и 1 строку текста. Итак, мне нужно отсортировать элементы по дате, вот так
Результат который мне нужен
text1 10.09.2021
text2 13.09.2021
text3 30.09.2021
text4 1.12.2021
Нынешний результат
text3 30.09.2021
text4 1.12.2021
text1 10.09.2021
text2 13.09.2021
Тексты и даты это два разных ArrayList'a
Суть вопроса в том, что как я могу отсортировав даты к примеру и отсортировать текст по таким же позициям как и даты? Либо это можно сделать как то одновременно?
Получаю данные с Firebase и отправляю в адаптер
List<String> reminder = new ArrayList<>();
List<String> date = new ArrayList<>();
Calendar test = Calendar.getInstance();
long pars = test.getTimeInMillis();
System.out.println(pars);
dbf.child("Reminders").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
reminder.clear();
date.clear();
for(DataSnapshot child2 : snapshot.getChildren()) { // getting a data from DB to ArrayList for dropping into Adapter
for(DataSnapshot tChild : child2.getChildren()) {
if (tChild.getKey().equals("text")) {
reminder.add(tChild.getValue().toString());
rem = reminder.toArray(new String[reminder.size()]);
}
if (tChild.getKey().equals("date")) {
date.add(tChild.getValue().toString());
dat = date.toArray(new String[date.size()]);
}
}
mainRowAdapter rAdapter = new mainRowAdapter(MainActivity.this, rem,dat);
rv.setAdapter(rAdapter);
rv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
выставление текста в адаптере
holder.reminder.setText(reminder[position]);
holder.date.setText(date[position]);
Как я пробовал сортировать даты - сортировка правильная, остается только понять как к этому добавить нужный текст
Collections.sort(date, new Comparator<String>() {
DateFormat f = new SimpleDateFormat("dd.M.yyyy");
@Override
public int compare(String o1, String o2) {
try {
return f.parse(o1).compareTo(f.parse(o2));
} catch (ParseException e) {
throw new IllegalArgumentException(e);
}
}
});
Я пробовал сортировать даты перед отправкой в адаптер и сверять с бд на наличие текста сортированной даты, но ничего толкового не вышло
UPDATED:
в комментариях порекомендовали получать объект и сортировать его по полю date. я попробовал получать список в List, но как его отсортировать так и не понимаю. Вот что из этого вышло
[text3 30.09.2021, text4 1.12.2021, text1 10.09.2021, text2 13.09.2021]
Ответы (1 шт):
import java.util.*;
import java.util.stream.Collectors;
public class Main {
private static final List<String> list1 = new ArrayList<>(Arrays.asList("text3", "text1", "text2"));
private static final List<Date> list2 = new ArrayList<>(Arrays.asList(new Date(1000000000), new Date(1), new Date(100000)));
public static void main(String[] args) {
ListSorter listSorter = new ListSorter();
listSorter.sort(list1, list2);
System.out.println(listSorter.getList1());
System.out.println(listSorter.getList2());
}
static class ListSorter {
private static class Entry {
private final String s;
private final Date d;
public Entry(String s, Date d) {
if (s == null || d == null) {
throw new IllegalArgumentException("null field in entry");
}
this.s = s;
this.d = d;
}
}
private final List<Entry> entries = new ArrayList<>();
private final Comparator<Entry> comparator = (e1, e2) -> {
if (e1 == null && e2 == null) {
return 0;
}
if (e1 == null) {
return 1;
}
if (e2 == null) {
return -1;
}
return e1.d.compareTo(e2.d);
};
public void sort(List<String> list1,
List<Date> list2) {
if (list1 == null || list2 == null || list1.size() != list2.size()) {
throw new IndexOutOfBoundsException("list is null or sizes not identical");
}
entries.clear();
for (int i = 0; i < list1.size(); i++) {
entries.add(new Entry(list1.get(i), list2.get(i)));
}
entries.sort(comparator);
}
public List<String> getList1() {
return entries.stream()
.map(e -> e.s)
.collect(Collectors.toList());
}
public List<Date> getList2() {
return entries.stream()
.map(e -> e.d)
.collect(Collectors.toList());
}
}
}