Android Recycleview多个视图类型在Kotlin中不工作

6psbrbz9  于 2022-12-27  发布在  Kotlin
关注(0)|答案(2)|浏览(131)

我有一个应用程序,使用房间数据库显示数据在recycleview。它的工作很好,当我加载数据分别从不同的表。但我想显示数据从两个表在一个单一的recycleview与多种视图类型,我知道如何合并表在房间,但它不工作。我得到空卡在recycleview当我加载数据。这是我已经尝试到目前为止。我的适配器类

class CategoriesAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

companion object {
    private const val TYPE_CATEGORIES = 0
    private const val TYPE_ARTICLES = 1
}

private val items: MutableList<Any> by lazy {
    ArrayList<Any>()
}

fun setItems(list: List<Any>) {
    items.addAll(list)
    notifyDataSetChanged()
}

override fun getItemViewType(position: Int): Int {
    return if (items[position] is Categories) TYPE_CATEGORIES  else TYPE_ARTICLES
}

override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return when (viewType) {
        TYPE_CATEGORIES -> CategoriesViewHolder.create(viewGroup)
        else -> ArticlesViewHolder.create(viewGroup)
    }
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    when (holder) {
        is CategoriesViewHolder -> {
            if (items[position] is Categories)
                holder.bind(items[position] as Categories)
        }
        is ArticlesViewHolder -> {
            if (items[position] is Articles)
                holder.bind(items[position] as Articles)
        }
    }
}

override fun getItemCount(): Int {
    return items.size
}

}

class CategoriesViewHolder (parent: View) : RecyclerView.ViewHolder(parent) {

val textView: TextView = parent.findViewById(R.id.categories_textView)

fun bind(category: Categories) {
    textView.text = category.categoryName


 }

companion object {
    fun create(parent: ViewGroup): CategoriesViewHolder {
        return CategoriesViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.categories_item_layout, parent, false))
    }
}
}

class ArticlesViewHolder (parent: View) : RecyclerView.ViewHolder(parent) {

val textView: TextView = parent.findViewById(R.id.titleText)

fun bind(articles : Articles) {
    textView.text = articles.articleName

}

companion object {
    fun create(parent: ViewGroup): ArticlesViewHolder {
        return ArticlesViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.article_item_layout, parent, false))
    }
}
}

这是我如何从我的活动设置数据

val db = AppDatabase.getDatabase(applicationContext)
    dao = db.articleDao()

    val recyclerView = findViewById<RecyclerView>(R.id.categories_recycle_view)
    recyclerView.layoutManager = LinearLayoutManager(this)
    recyclerView.adapter = CategoriesAdapter()
    adapter.setItems(dao.getAllArticlesAndCategories())

有人能帮忙吗?另外,我刚到Kotlin

iswrvxsc

iswrvxsc1#

代替

adapter.setItems(dao.getAllArticlesAndCategories())

使用实时数据观察器以避免在主线程上进行处理,并在实时数据的观察函数中进行调试,以确认您正在从DB接收正确的数据。

laawzig2

laawzig22#

adapter =类别适配器()
适配器?.setItems(列表(项目1,项目2 ....))
mrecyclerView.适配器=适配器
缺少类别和文章布局
android:布局宽度=“匹配父项”
安卓系统:布局高度=“ Package 内容”

相关问题