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

OSCHINA-MIRROR/hcanyz-ZAdapter

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

ZAdapter

Упрощение написания RecyclerView Adapter

https://github.com/hcanyz/ZAdapter

Поддерживает API v14+
Поддерживает androidx

Цели

Какие проблемы возникают при использовании recyclerview + adapter?

При использовании RecyclerView мы пишем много модульных кодов:

  • В getItemViewType определяются многие viewType константы в зависимости от объекта данных,
  • В onCreateViewHolder создаются соответствующие холдеры в соответствии с viewType,
  • Каждый бизнес-сценарий адаптера использует различные viewType, что приводит к множественным повторным определениям и объединению различных бизнес-холдеров в одном адаптере,
  • События между холдерами и контейнерами должны передаваться через адаптер,
  • Холдеры не имеют единого образца методов, таких как жизненный цикл холдера,
  • Холдеры плохо используются другими контейнерами помимо recyclerView.

Концепция

  • Через HolderTypeResolverRegistry связываем бин и создатель,
  • Через ViewHolderHelper передаем контейнер, а события передаются через ViewModel,
  • Через lifecycle определяется жизненный цикл холдера.

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

  1. Добавьте зависимость
// Корневой build.gradle
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
// Модуль, который будет использовать:
dependencies {
    implementation 'com.github.hcanyz.ZAdapter:ZAdapter:${version}'
}
  1. Создайте холдер и добавьте генератор для данных bean
// Объект данных, IHolderCreatorName
data class SimpleData(val test: String) : IHolderCreatorName
```// Простое представление с одним textView
class SimpleHolder(parent: ViewGroup) :
    ZViewHolder<SimpleData>(parent, R.layout.holder_item_fixed) {
    override fun update(data: SimpleData, payloads: List<Any>) {
        super.update(data, payloads)
        fv<TextView>(R.id.tv_ Yöntem).text = data.test
    }
}
  1. Создайте адаптер
// Инициализация списка
val listOf = arrayListOf<SimpleData>()
val zAdapter = ZAdapter<SimpleData>(listOf, ViewHolderHelper(fragmentActivity = this))

или

val zAdapter = ZAdapter<SimpleData>()
// Инициализация списка
val listOf = arrayListOf<SimpleData>()
zAdapter.datas = listOf
  1. Регистрация Creator, связывание RecyclerView
// Суть регистрации создателя заключается в том, чтобы привязать имя к методу creator
// Адаптер использует имя holderCreatorName, предоставленное бином, чтобы найти соответствующий метод creator и сгенерировать холдер
// По умолчанию ZAdapter предполагает, что существует реализация IHolderCreatorName, которая возвращает полное имя текущего класса
zAdapter.registry.registered(SimpleData::class.java.name) { parent ->
    return@registered SimpleHolder(parent)
}
// Если бин не реализует holderCreatorName, можно использовать регистратор выборщика, чтобы помочь ZAdapter найти имя Creator
zAdapter.registry.registered { position ->
    if (position < 10) String::class.java.canonicalName else null
}
zAdapter.registry.registered(String::class.java.name) { parent: ViewGroup ->
    return@registered object : ZViewHolder<String>(parent.context, TextView(parent.context)) {
        ...
    }
}
``````java
recyclerView.setLayoutManager(new LinearLayoutManager(context))
recyclerView.setAdapter(zAdapter)

Основная часть завершена. (Для примера см. проект приложения)

Дополнительно:

  1. Передача событий HOLDER в контейнер (фрагмент | активность): HOLDER передаёт события в контейнер через ViewModel

    // При создании адаптера добавьте ViewHolderHelper (fragmentActivity = this)
    // Это может быть как фрагмент, так и фрагмент-активность
    
    // Контейнер слушает события
    ViewModelProviders.of(this).get(EventViewModel::class.java).clickEvent.observe(...)
    
    // HOLDER отправляет события
    ViewModelProviders.of(context).get(EventViewModel::class.java).clickEvent.postValue(...)

    Контейнер изменяет данные HOLDER'а, вызывая notifyDataChanged.

  2. Отслеживание жизненного цикла HOLDER'а

    // В build.gradle добавьте kapt androidx.lifecycle:lifecycle-compiler:2.1.0
    // При создании HOLDER'а добавьте
    testHolder.getLifecycle().addObserver(new LifecycleObserverTest());
    public class LifecycleObserverTest implements LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        public void holderCreated(@NonNull LifecycleOwner owner) {
            Log.e(TAG, "HOLDERCreated -> cannot use data");
        }
    }
    // Для других событий используйте Lifecycle.Event.*
  3. Использование ZAdapter в других ViewGroup, таких как LinearLayout

    ...
    // При привязке используйте следующий метод
    linearLayout.injectViewWithAdapter(zAdapter);
  4. Ограничение частоты вызова notifyDataChanged

    // В некоторых случаях требуется ограничить частоту обновлений (например, получение сообщений в чате)
    // Добавьте зависимость в build.gradle:
    // implementation 'com.github.hcanyz.ZAdapter:ZAdapter-Throttle:1.0.0'
    val zAdapter = ZAdapterThrottle<SimpleData>()
    // Частота обновлений
    zAdapter.openThrottle(1000)
    // При вызове обновления
    zAdapter.notifyDataChangedWithThrottle()
    // При завершении активности onDestroy
    (recyclerView.getAdapter() as ZAdapterThrottle<*>).release();

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

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

1
https://api.gitlife.ru/oschina-mirror/hcanyz-ZAdapter.git
git@api.gitlife.ru:oschina-mirror/hcanyz-ZAdapter.git
oschina-mirror
hcanyz-ZAdapter
hcanyz-ZAdapter
master