Оптимизирована логика получения аннотаций, сокращено количество чтений аннотаций класса.
В ItemManager
добавлены методы setTag
и getTag
, позволяющие связывать Activity
или Fragment
и другие объекты. В TreeItem
можно получить этот объект.
В TreeItem
добавлен метод init
, который позволяет выполнять начальные настройки, такие как автоматическое раскрытие по умолчанию.
Добавлена переопределенная функция getItemOffsets
, чтобы соответствовать интерфейсу ItemDecoration
(старый метод всё ещё доступен).
Добавлена ветка androidx
для поддержки AndroidX
.
Версия: v1.3.1-androidx
Добавлена ветка Kotlin версий.
Версия: v1.3.1-kt
1. Поддерживает реализацию древовидной структуры списка и большинства других стилей списков.
2. Логика каждого элемента независима, полностью декомпозирована, что позволяет повторно использовать её.
3. Поддерживает модульность.
4. Поддерживает динамическую отправку данных сервером и динамическое объединение.
5. Минимальная вторжение, не меняет основные характеристики `RecyclerView`.
RecyclerView
, без вложенного использования.# Как использовать зависимости:implementation 'com.github.Jlanglang:TreeRecyclerView:1.3.1.1'
Добавьте следующее в корневой build.gradle:
repositories {
maven { url 'https://jitpack.io' }
}
// Разрешает складывание
TreeRecyclerAdapter treeRecyclerAdapter = new TreeRecyclerAdapter(TreeRecyclerType.SHOW_EXPAND);
public enum TreeRecyclerType {
/**
* Отображает все элементы, складывание и разворачивание недоступны.
* Для случаев, когда требуется показать все элементы сразу.
*/
SHOW_ALL,
/**
* Отображает состояние развертывания на основе isExpand.
* Для случаев, когда требуется показать многоуровневую структуру данных.
*/
SHOW_EXPAND,
Константа SHOW_DEFAULT
используется по умолчанию, если не указана другая конфигурация при создании объекта. Она отвечает за то, чтобы показывать только первый уровень вложенности, раскрывая его по клику, но изменения уровня не влияют на состояние других уровней.
При вызове конструктора можно передать конфигурацию SHOW_DEFAULT
, если она не указана явно, будет использоваться значение по умолчанию.
Обратите внимание! В этом примере нет понятия 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:
Используйте аннотацию на 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 )