Не специально для RecyclerViews, но есть некоторые замечательные функции языка Kotlin, которые вы можете использовать.
Лично я бы не делал это с макетом ограничения, но RecyclerView . Kotlin предлагает несколько хороших опций для работы с коллекциями , так что стоит использовать их, если вам нужно выполнить какие-либо манипуляции. Я бы посоветовал вам не делать список доступным как изменяемый вне адаптера. Это может быть достигнуто с использованием свойств поддержки .
. Для того, чтобы сделать их кликабельными, вы можете использовать OnItemTouchListener . Однако лично я предпочитаю использовать OnClickListener и callback. Обратный вызов принадлежит адаптеру, и OnClickListener добавляется в корневое представление держателя просмотра.
Помимо этого есть различные полезные приемы, которые вы можете использовать, например typealias .
Вот код, который я мог бы быстро придумать (я не делал никаких тестовых работ с приложениями переработчика, поэтому у меня нет правильно разработанного образца для рисования):
class ImageListAdapter : RecyclerView.Adapter<ImageListAdapter.ImageListItemVH>() {
private val _items = mutableListOf<ImageItem>()
val items: List<ImageItem>
get() = _items
var clickCallback: ImageClickCallback? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ImageListItemVH {
val itemView = LayoutInflater.from(parent.context)
.inflate(
R.layout.viewholder_image_list_item,
parent,
false
)
return ImageListItemVH(itemView)
}
override fun getItemCount(): Int = _items.size
override fun onBindViewHolder(holder: ImageListItemVH, position: Int) {
holder.bind(_items[position]) { clickCallback?.invoke(it) }
}
fun addItem(newItem: ImageItem) {
_items += newItem
notifyItemInserted(_items.size - 1)
}
fun addItems(newItems: List<ImageItem>) {
val sizeBefore = _items.size
_items += newItems
notifyItemRangeInserted(sizeBefore - 1, newItems.size)
}
fun clearItems() {
val sizeBefore = _items.size
_items.clear()
notifyItemRangeRemoved(0, sizeBefore - 1)
}
fun setItems(items: List<ImageItem>) {
_items.clear()
_items += items
notifyDataSetChanged()
}
class ImageListItemVH(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(imageItem: ImageItem, callback: (id: String) -> Unit) =
itemView.setOnClickListener { callback(imageItem.id) }
}
}
data class ImageItem(
val id: String,
val location: String
)
typealias ImageClickCallback = (id: String) -> Unit
Если коллекция изображений имеет большой размер или не ограничена небольшим количеством статических элементов, вам следует использовать библиотеку подкачки , особенно в этом случае PagedList