AnswerBun.com

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

Stack Overflow на русском Asked by GRAND on December 10, 2020

Здр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);
            }

One Answer

Группировка я так понимаю требуется визуальная. Для этих целей вам нужно в разметке добавить какое-то 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 имеет смысл установить ваши отступы если они есть.

Correct answer by Andrew on December 10, 2020

Add your own answers!

Related Questions

@media css внешний файл

2  Asked on January 6, 2022 by evolving

   

AngularJS Error: [$injector:unpr] Unknown provider

1  Asked on January 6, 2022 by yumie

   

Список из файла

1  Asked on January 4, 2022

     

Ошибка в Fragment

1  Asked on January 4, 2022

   

Ask a Question

Get help from others!

© 2022 AnswerBun.com. All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP