我的项目是一个费用跟踪器,我在其中显示一个日期列表,在该列表下我有一个在这些日期发生的费用列表。我嵌套了 RecyclerViews。父 RecyclerView 是所有费用的唯一日期列表。Child RecyclerView 是费用列表(当然,在唯一日期下查看)。我的 ViewModel 有一个 ExpenseEntity 的 LiveData 列表。ViewModel 必须有一个包含唯一日期的 LiveData 列表。我从 Room 数据库中获取了我的 ExpenseEntity 列表。
我的主要片段观察了 ExpenseEntities 的 LiveData,因为那时我需要更新我的父子回收器视图。
我无法弄清楚如何使用 Transformations.map 来获得唯一日期的实时转换列表。一旦更新了 ExpenseEntity 的 LiveData,我应该如何确保始终更新 Dates 的 LiveData?
MainActivityViewModel.kt
class MainActivityViewModel(private val expenseDao: ExpenseDao) : ViewModel() {
val allExpenses : LiveData<List<ExpenseEntity>> = expenseDao.fetchAllExpenses().asLiveData()
val uniqueDates : LiveData<List<Date>> = Transformations.map(allExpenses) {
it.map { expense ->
expense.date!!
}.distinct()
}
...
}
费用片段.kt
val factory = MainActivityViewModelFactory((activity?.application as SimpleExpenseTrackerApp).db.expenseDao())
expensesViewModel = ViewModelProvider(this, factory).get(MainActivityViewModel::class.java)
binding.rvParentExpenseDates.layoutManager = LinearLayoutManager(requireContext())
expensesViewModel.allExpenses.observe(viewLifecycleOwner){ expensesList ->
if (expensesList.isNotEmpty()){
binding.rvParentExpenseDates.adapter = expensesViewModel.uniqueDates.value?.let {
ParentDatesAdapter(it, expensesList) { expenseId ->
Toast.makeText(requireContext(), "Clicked expense with id: $expenseId", Toast.LENGTH_LONG).show()
}
}
binding.rvParentExpenseDates.visibility = View.VISIBLE
} else {
binding.rvParentExpenseDates.visibility = View.GONE
}
}
费用实体.kt
@Entity(tableName = "expense-table")
data class ExpenseEntity(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "date-time")
val dateTime : Date?,
val date : Date?,
@ColumnInfo(name = "account-type")
val accountType : String = "",
val category : String = "",
val amount : Double = 0.0,
val currency : String = "",
val note : String = ""
)