Android - 如何为Firestore RecyclerView适配器中的模型布局实现多个ViewHolder用于标题布局

问题描述 投票:2回答:1

我正在尝试使2个视图持有者一个将位于0位置,这将是用于选择图像的标题视图,另一个用于显示模型,我可以用于普通的recyclerview适配器,但在firestore recycler adapter我不能做它,我尝试它将项目数增加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

android firebase kotlin google-cloud-firestore firebaseui
1个回答
3
投票

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))
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.