Упрощение написания RecyclerView Adapter
https://github.com/hcanyz/ZAdapter
Поддерживает API v14+
Поддерживает androidx
При использовании RecyclerView мы пишем много модульных кодов:
getItemViewType
определяются многие viewType константы в зависимости от объекта данных,onCreateViewHolder
создаются соответствующие холдеры в соответствии с viewType,HolderTypeResolverRegistry
связываем бин и создатель,ViewHolderHelper
передаем контейнер, а события передаются через ViewModel,// Корневой build.gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
// Модуль, который будет использовать:
dependencies {
implementation 'com.github.hcanyz.ZAdapter:ZAdapter:${version}'
}
// Объект данных, 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
}
}
// Инициализация списка
val listOf = arrayListOf<SimpleData>()
val zAdapter = ZAdapter<SimpleData>(listOf, ViewHolderHelper(fragmentActivity = this))
или
val zAdapter = ZAdapter<SimpleData>()
// Инициализация списка
val listOf = arrayListOf<SimpleData>()
zAdapter.datas = listOf
// Суть регистрации создателя заключается в том, чтобы привязать имя к методу 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)
Основная часть завершена. (Для примера см. проект приложения)
Дополнительно:
Передача событий 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.
Отслеживание жизненного цикла 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.*
Использование ZAdapter в других ViewGroup, таких как LinearLayout
...
// При привязке используйте следующий метод
linearLayout.injectViewWithAdapter(zAdapter);
Ограничение частоты вызова 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 )