Просмотр не обновляется после первого запуска LiveData при использовании фоновой работы в Android

Я создаю долговое приложение на Android, используя Dagger 2 , Room и MVVM . Моя проблема связана с реактивностью моего основного вида, где отображается список долгов, и вы можете отметить их.

Когда эта деятельность запущена, все долги загружаются правильно, однако, когда я вставляю новый долг, вид не обновляется соответствующим образом .

Странная часть заключается в том, что когда я отмечаю одну из них, просмотр обновляется, как ожидалось.

После большой отладки я могу заключить, что проблема связана с жизненным циклом ViewModel, потому что долги создаются с использованием фонового задания. Если я жестко задал в конструкторе ViewModel новую вставку в базу данных, представление обновится, как ожидалось.

Вот мой код для Room Dao:

@Dao interface DebtDao { @Insert(onConflict = OnConflictStrategy.ABORT) fun insert(debt: Debt) @Query("SELECT * FROM debts WHERE id=:debtId") fun findOne(debtId: Long): Debt @Query("SELECT * FROM debts") fun findAll(): LiveData<List<Debt>> @Query(""" SELECT debts.*, p.name AS product_name, d.name AS debtor_name, c.name AS creditor_name FROM debts INNER JOIN products p ON debts.product_id = p.id INNER JOIN debtors d ON debts.debtor_id = d.id INNER JOIN creditors c ON debts.creditor_id = c.id """) fun findAllWithProductDebtorAndCreditor(): LiveData<List<DebtWithDebtorCreditorAndProduct>> @Update fun update(debt: Debt) } 

Активность:

 class DebtsListActivity : AppCompatActivity() { @Inject lateinit var viewModelFactory: ViewModelProvider.Factory override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val mainViewModel = ViewModelProviders.of(this, viewModelFactory).get(DebtsListViewModel::class.java) val debtsListAdapter = DebtsListAdapter(ArrayList()) { mainViewModel.payDebt(it.debt.id) showSuccess("Debt updated with success!") } mainViewModel.formattedDebts.observe(this, Observer<List<DebtWithDebtorCreditorAndProduct>> { if (it != null) { // This is only invoked when launching initially the activity or then ticking on of the debts as paid not when inserting a new debt debtsListAdapter.addItems(mainViewModel.getUnpaidDebts()) } }) rvDebts.layoutManager = LinearLayoutManager(this) rvDebts.adapter = debtsListAdapter } } 

Модель просмотра:

 class DebtsListViewModel @Inject constructor(var debtDao: DebtDao) : ViewModel() { private var debts: LiveData<List<Debt>> = debtDao.findAll() var formattedDebts: LiveData<List<DebtWithDebtorCreditorAndProduct>> = Transformations.switchMap(debts) { debtDao.findAllWithProductDebtorAndCreditor() } fun payDebt(debtId: Long) { val paidDebt = debtDao.findOne(debtId) debtDao.update(paidDebt.copy(paid = true)) } fun getUnpaidDebts(): List<DebtWithDebtorCreditorAndProduct> = formattedDebts.value?.filter { !it.debt.paid }.orEmpty() } 

Я хотел бы сделать это, чтобы уведомить форматированный список долгов, содержащий всю необходимую информацию.