提问者:小点点

从适配器访问DB(Kotlin)


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

@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上完成,但在这种情况下它必须传递给Adapter? 或者也许有更好(更干净)的方法来做这件事? 感谢任何帮助。 谢谢


共1个答案

匿名用户

适配器不应该负责从存储加载数据。 简单的方法是在ViewModel中访问repo,然后将数据传递给适配器。 这还为您提供了能够以简单的方式处理错误的好处,因为它将很容易更新包含adapter的布局,而不像从适配器执行此操作所需的意大利面,当然还有一个错误的设计。

另一个步骤是引入一个更分层的体系结构,就像Uncle Bob的clean体系结构