Все мы пишем приложения и у всех нас есть списки. И самое очевидное решение это RecyclerView. Сама по себе реализация не сложна и писать гайд по RecyclerView уже не актуально. Но есть одно но. Каждый раз когда нам нужен список мы создаем класс, в нем прописываем шаблонный методы, создаем шаблонные классы. Когда у нас 2-3 списка то ничего страшного в этом нет. Но когда их 10 или того более, то этого делать уже не хочется.
И вот столкнувшись с проблемой я начал искать. Нашел одну очень интересную реализацию на Kotlin. Она мне понравилась, но в ней не хватало нескольких элементов. Потратив еще пару часов, я смог доработать его и теперь реализация адаптера занимает несколько строчек. И здесь я хочу поделиться ею с вами.
Первое что нам необходимо сделать это создать адаптер.
abstract class GenericAdapter<T> : RecyclerView.Adapter<RecyclerView.ViewHolder> {
private var itemList = mutableListOf<T>()
constructor()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return getViewHolder(
LayoutInflater.from(parent.context)
.inflate(viewType, parent, false)
, viewType
)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
(holder as Binder<T>).bind(itemList[position], itemClickListener)
}
override fun getItemCount(): Int = itemList.size
override fun getItemViewType(position: Int): Int = getLayoutId(position, itemList[position])
fun update(items: List<T>) {
itemList = items.toMutableList()
notifyDataSetChanged()
}
protected abstract fun getLayoutId(position: Int, obj: T): Int
protected open fun getViewHolder(view: View, viewType: Int): RecyclerView.ViewHolder {
return ViewHolderFactory.create(view, viewType)
}
internal interface Binder<T> {
fun bind(data: T)
}
}