【问题标题】:Android - how to implement multiple ViewHolder one for header layout another for model layout in Firestore RecyclerView adapterAndroid - 如何实现多个 ViewHolder 一个用于标题布局另一个用于 Firestore RecyclerView 适配器中的模型布局
【发布时间】:2018-06-06 04:45:06
【问题描述】:

我正在尝试制作 2 个视图持有者,其中一个始终位于位置 0,这将是一个用于选择图像的标题视图,另一个用于显示模型, 我可以为普通的 recyclerview 适配器做到这一点,但在 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

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore firebaseui


    【解决方案1】:

    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))
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 2018-11-15
      相关资源
      最近更新 更多