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

OSCHINA-MIRROR/Jlanglang-TreeRecyclerView

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Обновление от 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 )

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

Введение

Рекурсивный `RecyclerView` в виде дерева. Развернуть Свернуть
Apache-2.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