【问题标题】:Recycler view with multiple view types,kotlin and sqlite具有多种视图类型、kotlin 和 sqlite 的回收器视图
【发布时间】:2019-06-30 15:49:49
【问题描述】:

我很难为从 sqlite 数据库加载的工作回收器视图添加不同的视图类型。我希望这是列表末尾的一个按钮,因为在布局末尾添加一个按钮是错误的,将来我会假装添加更多视图类型。

我看到了多个具有多种解决方案的示例,但我是初学者,我的 java 不是很好,因为我正在使用 kotlin 学习 android studio。

我试过了:

扩展回收站视图持有者

-我无法继续,因为我不懂java代码。

使用 BaseViewHolder

-我在 onCreateViewHolder 单元的返回类型和视图持有者的声明方面遇到了问题,所以我不能像我找到的示例那样做

我认为我的 getItemViewType 正在工作,我在 dbhandler 中的光标后添加一个 id =-10 的 1 行,以在列表末尾获取不同的视图类型。

override fun getItemViewType(position: Int) :Int  {
        return if (list[position].id.toInt() == -10 ){
            VIEW_TYPE_FOLLOWER
        }else{
            VIEW_TYPE_HEADER
        }
    }

当我尝试返回 ViewHolder 和 ViewHolder2 时,我对 onCreateViewHolder 有很多疑问,我得到了错误,所以这是我的工作视图。

override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {
        val v = LayoutInflater.from(p0.context).inflate(R.layout.list_layout, p0 , false)
        return ViewHolder(v)
    }

视图持有者

class ViewHolder(itemView: View) :RecyclerView.ViewHolder(itemView){
        val textViewName = itemView.findViewById(R.id.textViewName)as TextView
        val textViewNameEdit = itemView.findViewById(R.id.textViewNameEdit)as EditText
        val textViewAddress = itemView.findViewById(R.id.priorityLevel) as TextView

        val notas = itemView.findViewById(R.id.notas) as TextView
    }

我想要一个不同的视图类型在最后使它成为一个按钮。

【问题讨论】:

  • 从 java 开始,我不明白他的 OnCreateViewHolder 是如何指定返回类型的,另一个 aswer 扩展了回收器视图持有者,我将其添加到我的问题等中......

标签: android sqlite kotlin android-recyclerview


【解决方案1】:

第一步必须在适配器中声明一个字段,如自爆

private val EMPTY_ITEM = 0
private val NORMAL_ITEM = 1

所以,下一步你必须创建两个类型的实例viewHolder

inner class MyViewHolder(itemView: View) : ViewHolder(itemView) {
    var title: TextView = itemView.item_text

}

inner class EmptyMyViewHolder(itemView: View) : ViewHolder(itemView) {
    var titleEmpty: TextView = itemView.item_empty_text
}

并创建一个适合viewHolder的新实例

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val inflater = LayoutInflater.from(parent.context)
    return if (viewType == NORMAL_ITEM) {
        val v = inflater.inflate(R.layout.item, parent, false)
        vh = MyViewHolder(v)
        vh as MyViewHolder
    } else {
        val v = inflater.inflate(R.layout.item_empty, parent, false)
        vh = EmptyMyViewHolder(v)
        vh as EmptyMyViewHolder
    }
}

不要忘记覆盖 getItemViewType

override fun getItemViewType(position: Int): Int {
    return when (getItems()[position]) {
        is EmptySampleModel -> EMPTY_ITEM
        else -> NORMAL_ITEM
    }
}

最后一步用合适的数据绑定项目

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    when (holder) {
        is MyViewHolder -> {
            vh = holder
            val model = getItems()[position] as SampleModel
            (vh as MyViewHolder).title.text = model.getId().toString()
        }
        else -> {
            vh = holder
            val model = getItems()[position] as EmptySampleModel
            (vh as EmptyMyViewHolder).titleEmpty.text = model.getText()
        }
    }
}

【讨论】:

  • 谢谢!所以我只需要使用一个内部类!但是我仍然有一个问题,在 OnCreateViewHolder 的返回中它说这个演员“vh as ViewHolder”永远不会成功。我应该在哪里以及如何声明 vh ?
  • 欢迎您,为什么从来没有成功?你的孩子 viewHolder 必须是 ViewHolder 类的实例,也许有用的查找这个类github.com/alirezat775/carousel-view/blob/development/app/src/… 我在自己的库中实现了多视图注意:carousel-view 是高级回收器视图,sampleAdapter 类是recyclerViewAdapter 的实例
猜你喜欢
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多