1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Jlanglang-TreeRecyclerView

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 10 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 15.03.2025 14:30 532ca49

Обновление от 2021-03-07

  1. Оптимизирована логика получения аннотаций, сокращено количество чтений аннотаций класса.

  2. В ItemManager добавлены методы setTag и getTag, позволяющие связывать Activity или Fragment и другие объекты. В TreeItem можно получить этот объект.

  3. В TreeItem добавлен метод init, который позволяет выполнять начальные настройки, такие как автоматическое раскрытие по умолчанию.

  4. Добавлена переопределенная функция getItemOffsets, чтобы соответствовать интерфейсу ItemDecoration (старый метод всё ещё доступен).


Обновление

Добавлена ветка androidx для поддержки AndroidX. Версия: v1.3.1-androidx

Добавлена ветка Kotlin версий. Версия: v1.3.1-kt

996.icu LICENSE

Особенности

1. Поддерживает реализацию древовидной структуры списка и большинства других стилей списков.
2. Логика каждого элемента независима, полностью декомпозирована, что позволяет повторно использовать её.
3. Поддерживает модульность.
4. Поддерживает динамическую отправку данных сервером и динамическое объединение.
5. Минимальная вторжение, не меняет основные характеристики `RecyclerView`.

Примеры:image

image image image image image

Все вышеуказанные примеры используются всего один RecyclerView, без вложенного использования.# Как использовать зависимости:
implementation 'com.github.Jlanglang:TreeRecyclerView:1.3.1.1'

Добавьте следующее в корневой build.gradle:

repositories {
    maven { url 'https://jitpack.io' }
}

Как использовать:

1. Вам нужно создать адаптер:

// Разрешает складывание
TreeRecyclerAdapter treeRecyclerAdapter = new TreeRecyclerAdapter(TreeRecyclerType.SHOW_EXPAND);

2. Выберите способ разворачивания:

public enum TreeRecyclerType {
    /**
     * Отображает все элементы, складывание и разворачивание недоступны.
     * Для случаев, когда требуется показать все элементы сразу.
     */
    SHOW_ALL,

    /**
     * Отображает состояние развертывания на основе isExpand.
     * Для случаев, когда требуется показать многоуровневую структуру данных.
     */
    SHOW_EXPAND,

Пример использования константы SHOW_DEFAULT

Константа SHOW_DEFAULT используется по умолчанию, если не указана другая конфигурация при создании объекта. Она отвечает за то, чтобы показывать только первый уровень вложенности, раскрывая его по клику, но изменения уровня не влияют на состояние других уровней.

Конструктор с параметром SHOW_DEFAULT

При вызове конструктора можно передать конфигурацию SHOW_DEFAULT, если она не указана явно, будет использоваться значение по умолчанию.


Как создать элемент Item

Обратите внимание! В этом примере нет понятия ViewHolder, используются только TreeItem и TreeItemGroup. Дочерние и родительские элементы.### Пример родительского элемента:

/**
 * Город
 */
public class CountyItemParent extends TreeItemGroup<ProvinceBean.CityBean> { // Генерик представляет собой связанный Java-bean

    // Создание списка дочерних TreeItem.
    @Override
    public List<TreeItem> initChildList(ProvinceBean.CityBean data) {
        return ItemHelperFactory.createItems(data.getAreas(), this);
    }

    // Отображаемый Layout для этого уровня
    @Override
    public int getLayoutId() {
        return R.layout.item_two;
    }

    // Соединение view и данных
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder) {
        holder.setText(R.id.tv_content, data.getCityName());
    }
}

Пример дочернего элемента:

/**
 * Район
 */
public class AreaItem extends TreeItem<ProvinceBean.CityBean.AreasBean> { // Генерик представляет собой связанный Java-bean

    @Override
    public int getLayoutId() {
        return R.layout.item_three;
    }

    // Операция привязки
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder) {
        holder.setText(R.id.tv_content, data.getAreaName());
    }

    // Этот элемент занимает определённое количество пространства в каждой строке RecyclerView, если был установлен GridLayoutManager.
    // Здесь используется деление, чтобы можно было менять общее количество элементов GridLayoutManager без необходимости изменения каждого элемента.
    @Override
    public int getSpanSize(int maxSpan) {
        return maxSpan / 6;
    }
}

Как создать элемент Item

Существует два способа создания элемента Item:

Первый способ:

Используйте аннотацию на Java-bean.

@TreeDataType(iClass = AreaItem.class)
public class AreasBean {
...
}

Затем передайте bean-объект.

ItemHelperFactory.createItems(list, treeItemGroup);
```### Второй способ:

Прямая передача bean-объекта и класса item.
```java
ItemHelperFactory.createItems(list, Item.class, treeItemGroup);

Как обновить адаптер:

Методы добавления, удаления и замены элементов доступны.

treeRecyclerAdapter.getItemManager().replaceAllItem(items); // Замена всех элементов
treeRecyclerAdapter.getItemManager().addItems(items); // Добавление группы элементов
treeRecyclerAdapter.getItemManager().removeItems(items); // Удаление группы элементов
@Override
public void onClick(ViewHolder viewHolder) {
    super.onClick(viewHolder);
    getItemManager().notifyDataChanged();
}  

# 5. Как установить нажатие на элемент:

1. Переопределите метод `onClick()` в классе `TreeItem`.

2. Установите слушатель событий нажатия в адаптере с помощью `setOnItemClickListener`.

adapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener() { @Override public void onItemClick(@NonNull ViewHolder viewHolder, int position) {

        }
    });
##### Внимание: оба этих способа конфликтуют друг с другом.
Приоритет `ItemClickListener` выше приоритета переопределенного метода `onClick` в классе `TreeItem`.


# Что делать, если не хочется писать класс элемента?

Используйте `SimpleTreeItem`.

ArrayList items = new ArrayList<>(); for (Pair itemPair : itemPairs) { SimpleTreeItem simpleTreeItem = new SimpleTreeItem(R.layout.item_mine) // передайте id шаблона. .onItemBind(viewHolder -> {

        })
        .onItemClick(viewHolder -> {

        });
simpleTreeItem.setData(itemPair);
items.add(simpleTreeItem);

} adapter.getItemManager().replaceAllItem(items);


-keep public class * extends com.baozi.treerecyclerview.item.TreeItem {} -keep public class * extends android.support.annotation.*


# Итог
Просто установите адаптер. Адаптер можно не заполнять данными заранее.
Вы можете сразу установить адаптер, а затем использовать `adapter.getItemManager().replaceAllItems(items)`.

recyclerView.setAdapter(adapter);


Дополнительные эффекты можно найти в демо.
### Все вопросы и предложения приветствуются. Группа поддержки QQ: 493180098

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Jlanglang-TreeRecyclerView.git
git@api.gitlife.ru:oschina-mirror/Jlanglang-TreeRecyclerView.git
oschina-mirror
Jlanglang-TreeRecyclerView
Jlanglang-TreeRecyclerView
master