【发布时间】: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