У меня проблемы с удалением данных из моей коллекции Firestore, когда пользователь нажимает кнопку удаления в обзоре переработчика. Я могу без проблем удалить его из окна восстановления, но у меня возникают проблемы с установлением соединения между адаптером, моделью представления и хранилищем, которое выполняет операции Firestore.
В моем адаптере я удаляю элемент пользователь щелкнул по представлению recycler:
class ArticleAdapter : RecyclerView.Adapter<ArticleAdapter.ViewHolder>() {
var data = mutableListOf<Product>()
set(value) {
field = value
notifyDataSetChanged()
}
override fun getItemCount() = data.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = data[position]
holder.bind(item)
holder.deleteButton.setOnClickListener {
data.removeAt(position)
notifyDataSetChanged()
}
} ...
Представление recycler заполняется после запроса к коллекции Firestore в моей модели просмотра:
class ArticleViewModel(private val repository: ProductRepository) : ViewModel() {
var savedProducts: MutableLiveData<MutableList<Product>> = MutableLiveData<MutableList<Product>>()
init {
savedProducts = getProducts()
}
fun getProducts(): MutableLiveData<MutableList<Product>> {
repository.getProducts().addSnapshotListener(EventListener<QuerySnapshot> { value, e ->
if (e != null) {
savedProducts.value = null
return@EventListener
}
val savedProductsList: MutableList<Product> = mutableListOf()
for (doc in value!!) {
val item = doc.toObject(Product::class.java)
item.id = doc.id
savedProductsList.add(item)
}
savedProductsList.sortBy { i -> i.productName }
savedProducts.value = savedProductsList
})
return savedProducts
} }
В моем фрагменте я наблюдаю за любым Изменения, которые могут произойти с сохраненными продуктами:
class ArticleOverviewFragment : Fragment(), KodeinAware {
override val kodein: Kodein by kodein()
private val factory: ArticleViewModelFactory by instance()
private lateinit var viewModel: ArticleViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding: FragmentArticleOverviewBinding =
DataBindingUtil.inflate(inflater, R.layout.fragment_article_overview, container, false)
viewModel = ViewModelProviders.of(this, factory).get(ArticleViewModel::class.java)
binding.viewModel = viewModel
val adapter = ArticleAdapter()
binding.recyclerViewGoods.adapter = adapter
viewModel.savedProducts.observe(viewLifecycleOwner, Observer {
it?.let {
adapter.data = it
}
})
...
} }
Есть ли способ, которым я могу наблюдать / сохранять идентификатор удаленного элемента в моем адаптере и "переносить" этот идентификатор из адаптера в пользовательский интерфейс, куда я звоню функция, объявленная в viewmodel, когда заполнено это поле, содержащее идентификатор? Или я должен напрямую получить доступ к viewmodel из адаптера? Почему-то это не так ...