【问题标题】:Access DB from adapter (Kotlin)从适配器访问数据库 (Kotlin)
【发布时间】:2020-06-14 13:15:46
【问题描述】:

我有一个类别列表,我想显示每个类别中的项目数量。使用带有 MVVM 架构的 Room 基本上我想在我的适配器中使用简单的查询,以返回它的值(项目数量)

DAO

@Query("SELECT COUNT(id) FROM items WHERE listId=:listID")
suspend fun countItems(listID: Long):Int

回购

suspend fun countItems(id: Long): Int{
        return itemsDao.countItems(id)
    }

适配器

class ListsAdapter internal constructor(
    context: Context
) : RecyclerView.Adapter<ListsAdapter.ListViewHolder>() {

    private val inflater: LayoutInflater = LayoutInflater.from(context)
    private var lists = mutableListOf<ListItem>()

    inner class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
        val listName: TextView = itemView.findViewById(R.id.single_list_name)
        val listIcon: ImageView = itemView.findViewById(R.id.single_list_icon)
        val wAmount: TextView = itemView.findViewById(R.id.single_list_amount)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListsAdapter.ListViewHolder {
        val itemView = inflater.inflate(R.layout.single_list, parent, false)
        return ListViewHolder(itemView)
    }

    override fun getItemCount() = lists.size

    override fun onBindViewHolder(holder: ListsAdapter.ListViewHolder, position: Int) {
        val current = lists[position]
        holder.listName.text = current.name
     // holder.wAmount.text =

        holder.itemView.setOnClickListener {
            val bundle = bundleOf("list_id" to current.id,"list_name" to current.name)
            holder.itemView.findNavController().navigate(R.id.action_listsFragment_to_nav_items_list, bundle)
        }
    }

    internal fun setLists(lists: List<ListItem>) {
        this.lists = lists.toMutableList()
        notifyDataSetChanged()
    }

    internal fun listToDelete(viewHolder: RecyclerView.ViewHolder) : ListItem{
        val position = viewHolder.adapterPosition
        return lists[position]
    }

    internal fun removeList(viewHolder: RecyclerView.ViewHolder){
        lists.removeAt(viewHolder.adapterPosition)
        notifyItemRemoved(viewHolder.adapterPosition)
    }
}

是否应该通过 ViewModel 完成,但在这种情况下必须将其传递给适配器?或者也许有更好(更清洁)的方法来做到这一点?任何帮助表示赞赏。谢谢

【问题讨论】:

  • 从视图模型而不是适配器访问数据库并将数据传递给适配器
  • 使用interface 让使用适配器的视图“观察”变化,然后让视图从 ViewModel 调用您的方法。

标签: android kotlin mvvm android-room


【解决方案1】:

适配器不应该负责从存储中加载数据。干净的方法是访问您的ViewModel 中的存储库,然后将数据传递给您的Adapter。这也使您能够以直接的方式处理错误,因为它很容易更新包含 Adapter 的布局,不像意大利面条,您需要从适配器执行此操作,此外当然是错误的设计。

另一个步骤是引入更分层的架构,例如Uncle Bob's clean architecture

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多