Заполнение базы Room c использованием MVP + Dagger2+Kotlin
В приложении осуществляется добавление в базу количества товаров и итоговую цену. Потом все это должно выводиться в список с помощью адаптера. Проблема в том. что ничего не добавляется. Выводится только тост из doOnSubcribe. Остальные тосты не выводятся. Мне кажется, что оно не доходит до subcribeBy
БД
@Parcelize
@Entity(tableName = "food_checklist")
class FoodEntity : Parcelable {
@PrimaryKey
var id: Long? = null
@ColumnInfo(name = "price")
var price: Double? = null
@ColumnInfo(name = "count")
var count: Int = 0
@ColumnInfo(name = "type")
var type: String = TYPE_RESTAURANT
override fun equals(other: Any?): Boolean {
return (other as FoodEntity).id == id
}
Presenter
subscriptions += dataManager.getAllFoods()
.doOnSubscribe { viewState.showErrorToast("Получение из базы запущено") }
.doOnError { viewState.showErrorToast("Ошибка при получении из базы") }
.doAfterTerminate { }
.subscribeBy(
onNext = { productFromDatabase ->
this.productFromDatabase = productFromDatabase
var value = 0
productFromDatabase.forEach {
value += (it.count * it.price!!.toInt())
for (i in 0..productFromDatabase.size) {
productFromDatabase[i].count = it.count
productFromDatabase[i].price = it.price
}
viewState.showSavedProducts(productFromDatabase)
}
viewState.showErrorToast("Данные получены")
},
onComplete = {},
onError = {}
)
}
Активити
override fun showSavedProducts(savedProducts: List<FoodEntity>) {
val productsFromNetwork =
(listProductsRecyclerView.adapter as SupermarketProductsAdapter).supermarketProducts
savedProducts.forEach { productsEntity ->
productsFromNetwork.forEach { product ->
product.count = productsEntity.count
}
}
(listProductsRecyclerView.adapter as SupermarketProductsAdapter).notifyDataSetChanged()
}
Адаптер
class SupermarketProductsAdapter(
var supermarketProducts: List<SupermarketProducts>,
var savedProduct: List<FoodEntity>? = null,
val addProduct: ((supermarketProducts: FoodEntity) -> Unit)? = null,
val deleteProduct: ((supermarketProducts: FoodEntity) -> Unit)? = null,
val countChangeClickListener: ((supermarketProducts: FoodEntity) -> Unit)? = null
):
RecyclerView.Adapter<SupermarketProductsAdapter.ListProductsViewHolder>() {
inner class ListProductsViewHolder(override val containerView: View)
: RecyclerView.ViewHolder(containerView), LayoutContainer {
private lateinit var supermarketProducts: SupermarketProducts
@SuppressLint("SetTextI18n")
fun bind(supermarketProducts: SupermarketProducts){
this.supermarketProducts = supermarketProducts
with(containerView){
Glide.with(this)
.load(supermarketProducts.imageListProducts)
.into(imageItemListProducts)
nameItemListProducts.text = supermarketProducts.nameListProducts
newPriceItemListProducts.text = "${supermarketProducts.newPriceListProducts} ₽"
oldPriceItemListProducts.text = "${supermarketProducts.oldPriceListProducts} ₽"
//Проверка новой и старой цен
if(supermarketProducts.newPriceListProducts == supermarketProducts.oldPriceListProducts) {
oldPriceItemListProducts.makeGone()
newPriceItemListProducts.setTextColor(resources.getColor(R.color.black))
}
checkCount(supermarketProducts.count)
//Добавление в корзину
plusItemListProducts.setOnClickListener {
supermarketProducts.count += 1
addProduct?.invoke(supermarketProducts.mapToEntity())
checkCount(supermarketProducts.count)
countChangeClickListener?.invoke(supermarketProducts.mapToEntity())
}
//Удаление из корзины
minusItemListProducts.setOnClickListener {
supermarketProducts.count -= 1
deleteProduct?.invoke(supermarketProducts.mapToEntity())
checkCount(supermarketProducts.count)
countChangeClickListener?.invoke(supermarketProducts.mapToEntity())
}
}
}
//Видимость минуса и количества
private fun checkCount(count: Int){
if (count == 0){
minusItemListProducts.makeGone()
countItemListProducts.makeGone()
}
else{
minusItemListProducts.makeVisible()
countItemListProducts.makeVisible()
countItemListProducts.text = count.toString()
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, position: Int): ListProductsViewHolder {
return ListProductsViewHolder(LayoutInflater.from(parent.context)
.inflate(R.layout.item_product_supermarket, parent, false))
}
override fun getItemCount() = supermarketProducts.size
override fun onBindViewHolder(viewHolder: ListProductsViewHolder, position: Int) {
viewHolder.bind(supermarketProducts[position])
}