Группировка RecyclerView Android

151
15 апреля 2022, 21:50

Здрaвcтвуйте! Подскажите пожалуйста, как мне сгруппировать recyclerview? Цифры слева на фото -это семестры. Хочу сгруппировать по семестрам.

 JSONArray array = new JSONArray(response);
            if (array.length()!=0) {
                for (int i = 0; i < array.length(); i++) {
                    JSONObject raspObject = array.getJSONObject(i);
                    MarksStudent marksStudent = new MarksStudent();
                    marksStudent.setMarksemestr(raspObject.getString("semectr"));
                    marksStudent.setMarkpredmet(raspObject.getString("predmet"));
                    marksStudent.setMarktype(raspObject.getString("typeexam"));
                    marksStudent.setOcenka(raspObject.getString("ocenka"));
                    arrayList.add(marksStudent);
                }
                marksAdapter = new MarksAdapter(getContext(), arrayList);
                recyclerView.setAdapter(marksAdapter);
            }
Answer 1

Группировка я так понимаю требуется визуальная. Для этих целей вам нужно в разметке добавить какое-то view определенного размера или сетить к элементу списка марджин сверху/снизу программно чтобы как-то отделить один семестр от другого. Вообще по логике, в вашем вопросе не хватает кода адаптера списка который занимается выводом данных. А именно метода занимающегося заполнением элемента данными:

@Override
public void onBindViewHolder(CustomAdapter.ViewHolder holder, int position) {
    ...
}

В конструктор помимо всякого-разного вы передаете массив состоящий из объектов класса MarksStudent. У этого класса (который вы опять таки не приводите) есть поле что-то типа marksSemestr которое хранит значение семестра которое в вышеуказанном методе вам нужно проверять и либо как уже говорилось раннее сетить марджин либо делать видимым какой-то view. Получаем элемент для отображения:

MarksStudent marksStudent = this.arrayList.get(position)

дальше проверяем если предыдущий элемент массива если он есть имеет поле семестра меньше чем у текущего то делаем видимой часть отвечающую за отступ:

if(position != 0 && marksStudent.getMarksemestr() > this.arrayList.get(position-1).getMarksemestr()){
holder.divider.setVisibility(View.VISIBLE);
}else{
holder.divider.setVisibility(View.GONE);
}

другой вариант - увеличение отступа программно:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(0,20,0,0); // left, top, right, bottom
holder.itemView.setLayoutParams(params);

Стоит учитывать что здесь params.setMargins(0,20,0,0); сетятся новые марджины для элемента списка и есть вероятность что ваши установленные отступы могут слететь. Поэтому я думаю вместо 0 имеет смысл установить ваши отступы если они есть.

READ ALSO
Java Comparator : possible lossy conversion from double to int

Java Comparator : possible lossy conversion from double to int

Нужно сравнить значения double c помощью ComparatorМой код:

249
Создание нового проекта Java Enterprise Intellij idea [закрыт]

Создание нового проекта Java Enterprise Intellij idea [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

174
Как установить атрибуты SameSite=none и Secure для JSESSIONID cookie?

Как установить атрибуты SameSite=none и Secure для JSESSIONID cookie?

Большая часть сайта статическая, расположена на github, но есть форма обратной связи, которая расположена на другом сервере, написана на spring-webmvcИспользую...

117
Пунктирный ProgressBar

Пунктирный ProgressBar

Нужно создать пунктирную шкалу прогресса, как показано на картинке:

233