2021-3-7更新
Оптимизирована логика получения аннотаций, уменьшено количество чтений аннотаций класса.
В ItemManager добавлены методы setTag и getTag для привязки объектов Activity или Fragment. TreeItem может получить доступ к этому объекту.
В TreeItem добавлен метод init для выполнения некоторых настроек инициализации, таких как по умолчанию развёрнутое состояние и т. д.
Добавлена переписанная функция getItemOffsets, которая соответствует интерфейсу ItemDecoration (старый метод всё ещё сохраняется).
Обновление
Добавлена ветка androidx. Поддержка androidX. Версия: v1.3.1-androidx.
Добавлена версия Kotlin. Версия: v1.3.1-kt.
Особенности
Пример изображения:
Все примеры используют только один 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> {// Универсальный тип представляет связанный javabean
// Создание дочернего TreeItem.
@Override
public List<TreeItem> initChildList(ProvinceBean.CityBean data) {
return ItemHelperFactory.createItems(data.getAreas(), this);
}
// Конкретный макет этого уровня
@Override
public int getLayoutId() {
return R.layout.item_two;
}
// Связывание представления и данных
@Override
public void onBindViewHolder(@NonNull ViewHolder holder) {
holder.setText(R.id.tv_content, data.getCityName());
}
}
/**
* Округ
*/
public class AreaItem extends TreeItem<ProvinceBean.CityBean.AreasBean> {// Универсальный тип представляет связанный javabean
@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 занимает долю, только если RecyclerView установлен GridLayoutManager, он будет иметь эффект.
// Здесь причина использования деления заключается в том, что можно достичь цели изменения только общего числа GridLayoutManager без изменения каждого элемента, конечно, вы также можете напрямую вернуть значение int.
@Override
public int getSpanSize(int maxSpan) {
return maxSpan / 6;
}
}
Есть два способа:
Используйте аннотации в javabean,
@TreeDataType(iClass = AreaItem.class)
public class AreasBean{
...
}
Затем передайте объект bean
ItemHelperFactory.createItems(list, treeItemGroup);
Передайте объект bean напрямую и класс элемента,
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();
}
Перепишите метод onClick()
в TreeItem
.
Установите setOnItemClickListener
в адаптере.
adapter.setOnItemClickListener(new **BaseRecyclerAdapter.OnItemClickListener()**
@Override public void onItemClick(@NonNull ViewHolder viewHolder, int position) {
} });
**Внимание: два элемента конфликтуют.**
`ItemClickListener` имеет более высокий приоритет, чем `onClick` у `TreeItem`.
# Как быть, если вы не хотите создавать класс Item?
Используйте `SimpleTreeItem`:
ArrayList items = new ArrayList<>(); for (Pair itemPair : itemPairs) { SimpleTreeItem simpleTreeItem = new SimpleTreeItem(R.layout.item_mine)//передаём идентификатор макета. .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.**
**Наконец:**
Можно сразу установить адаптер. Необязательно сначала вызывать setData. Можно сразу вызвать setAdapter, а затем `adapter.getItemManager().replaceAllItem(items);`
recyclerView.setAdapter(adapter);
Больше эффектов можно увидеть в демонстрационной версии.
### Приглашаем всех к обсуждению и вопросам. Группа для общения в QQ: 493180098.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )