Intereting Posts
Расширение полей в Котлине Использование publishOn и subscribeOn в потоке приводит к тому, что ничего не происходит Экземпляр Kotlin KClass внутри функции расширения Делегирование конструктора Котлина во внутренний класс данных? Делегация Котлина выражает вместо фиксированной ссылки Как создать экземпляр анонимного класса, который реализует интерфейс в Kotlin Как сериализовать карту в строку JSON через JSON.stringify в kotlin JS? Подстановочные знаки в Котлине для переменных Intellij не создает классы Установить LayoutManager на фрагменте Как вызвать конструктор родового типа в конструкторе класса Присвоить лямбда непосредственно унаследованному абстрактному методу Наследовать от абстрактного класса с умножением варов в Котлине Невозможно включить предупреждение «тип платформы объявлений» Kotlin в сообщение об ошибке Scala эквивалентный способ Range для пользовательского класса

Android – как реализовать несколько ViewHolder для макета заголовка другого для макета модели в адаптере Firestore RecyclerView

Я пытаюсь сделать 2 держателя для просмотра, каждый будет всегда в позиции 0, который будет представлять собой заголовок для выбора изображения, другой для отображения модели, я могу сделать это для обычного адаптера recycliewiew, но в адаптере перехватчика firestore я не могу сделать это, я пытаюсь увеличить количество предметов на 1, но я получил

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 

Это мой код класса адаптера:

 val TYPE_SELECT_IMAGE = 0 val TYPE_ITEMS = 1 class UsersImageAdapter(options: FirestoreRecyclerOptions<UserImage>) : FirestoreRecyclerAdapter<UserImage, RecyclerView.ViewHolder>(options) , AnkoLogger{ override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int, model: UserImage) { when(holder){ is SelectImageViewHolder -> { holder.bindModel() } is UserImageViewHolder -> { holder.bindImages(model) } } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { TYPE_SELECT_IMAGE -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_add_image, parent, false) SelectImageViewHolder(view) } TYPE_ITEMS -> { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_image,parent,false) UserImageViewHolder(view) } else -> throw RuntimeException() } } override fun getItemViewType(position: Int): Int { return if (isPositionHeader(position)) { TYPE_SELECT_IMAGE } else { TYPE_ITEMS } } fun isPositionHeader(position: Int): Boolean { return position == 0 } override fun getItemCount(): Int { return super.getItemCount() + 1 } } 

и это два держателя вида один для заголовка, другой для отображения модели

 class SelectImageViewHolder(val view: View) : RecyclerView.ViewHolder(view) , AnkoLogger{ fun bindModel() { view.setOnClickListener { info { "clicked !" } } } } class UserImageViewHolder(val view: View) : RecyclerView.ViewHolder(view) { fun bindImages(userImage: UserImage) { val imageView = view.findViewById<ImageView>(R.id.image_user_post) Glide.with(view.context).load(userImage.imageUrl).into(imageView) } } 

моя цель – всегда держать SelectImageViewHolder в позиции 0

FirebaseUI здесь. onBindViewHolder(RecyclerView.ViewHolder, Int, Model) делает внутренний вызов getItem(position) внутренне, чтобы легко заполнить вашу модель. Поскольку вы вручную вводите элемент, RecyclerView будет думать, что есть элементы в базе данных и взорвется, как вы видели. Чтобы исправить это, вы захотите переопределить собственный onBindViewHolder(RecyclerView.ViewHolder, Int) без вызова super:

 override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when(holder) { is SelectImageViewHolder -> holder.bindModel() is UserImageViewHolder -> { // Manually get the model item holder.bindImages(getItem(position - 1)) } } }