Удалить элемент из рециркуляции просмотра по нажатию кнопки - Kotlin MVVM Firestore - PullRequest
0 голосов
/ 16 апреля 2020

У меня проблемы с удалением данных из моей коллекции 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 из адаптера? Почему-то это не так ...

1 Ответ

1 голос
/ 16 апреля 2020

Объявите одну локальную переменную

var removedPosition : Int ? = null

, затем обновите эту переменную до события onClick deleteButton

holder.deleteButton.setOnClickListener {
        data.removeAt(position)
        removedPosition = position
        notifyDataSetChanged()
    }

Пожалуйста, сделайте один метод в адаптере (ArticleAdapter)

fun getRemoveItemPosition() : Int {
   var position = removedPosition
   return position;
}

, которые возвращают позицию удаленного предмета и вызывают этот метод в пользовательском интерфейсе (ArticleOverviewFragment), где вам потребуется получить позицию удаленного предмета из обзора переработчика

var removedItemPosition = adapter.getRemoveItemPosition()

Теперь вы получите значение позиции удаленного элемента, используя переменную с именем removedItemPosition


. Таким образом, вы можете получить позицию удаленного элемента в пользовательском интерфейсе, где вы можете вызвать функцию, объявленную в модели представления (ArticleViewModel) для удаления. особый предмет в коллекции камина.
...