Как удалить значение из Listview значения которых хранятся в firebase?
Я знаю что надо как то получить autoID но не понимаю как, и как возможно сделать так чтобы при долгом нажатии на значение в списке можно было ее удалить из firebase
Ответы (1 шт):
@SmileXD!
Ваш вопрос является комплексным, и требует разделения.
1. Вопрос про ListView
В нынешнее время Вам не следует использовать ListView в Android приложениях, т.к. уже давно доступен более эффективный виджет - RecyclerView. Google в первом же абзаце об этом и говорит
Displays a vertically-scrollable collection of views, where each view is positioned immediatelybelow the previous view in the list. For a more modern, flexible, and performant approach to displaying lists, use RecyclerView
2. Как удалить из списка по долгому нажатию
Так как я надеюсь, что Вы пересмотрите свое решение и замените ListView в свом экране на RecyclerView, то для обработки длительного нажатия Вам нужно во ViewHolder'е установить setOnLongClickListener() на контейнер, который содердит в себе элемент списка.
шаг 1: определить interface, который будет отвечать за передачу действия куда нужно. Пусть будет так
// код на Kotlin
interface MyItemClickListener {
fun onItemLongClick(entity: Entity)
}
шаг 2: во Fragment'e или Activity нужно реслизовать этот interface
шаг 3: в MyCustomAdapter передать ссылку класса Вашего Fragment`Activity`. В конструктор можно.
private val adapter: MyCustomAdapter by lazy { MyCustomAdapter(this) }
шаг 4: В адаптере эту ссылку нужно будет передавать в каждый элемент списка Вашего RecyclerView.ViewHolder класса в методе onBindViewHolder(...).
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val entity = getItem(position)
holder.bind(entity, clickListener)
}
шаг 5: Непосредственно в классе MyViewHolder будет следующее
class MyViewHolder(
private val binding: ItemCardElementBinding
) : RecyclerView.ViewHolder(binding.root) {
fun bind(entity: MyEntity, clickListener: MyItemClickListener ) {
// код инициализации виджетов, какая-то логика вывода данных в ячейку списка
binding.containerView.setOnLongClickListener { clickListener.onItemLongClick(entity) }
}
}
шаг 6: В реализации метода onItemLongClick(entity: MyEntity) {} в Fragment \ Activity нужно отправить запрос на удаление в Ваш Presenter \ ViewModel, которые далее по правильной цепочке (опущено, чтобы не растягивать ответ) передадут вызов в репозиторий Firebase (Firebase RealTime Database \ Firebase Firestore). К примеру, он будет называться FirebaseDBImpl.
шаг 7: Этот репозиторий отправит запрос на сервер Firebase с помощью методов API Firebase. К примеру, так:
шаг 8: Асинхронно передать результат удаления из БД обратно в Presenter \ UseCase -> ViewModel, которые так же анхронно вызовят метод у Fragment \ Activity. Последние должны отправить запрос на обновление состояния Вашего адаптера для RecyclerView:
- используя DiffUtils
- используя удаление элемента из коллекции адаптера, а потом вызвывать
notifyItemRemoved().
Как Вы могли заметить, я постарался дать Вам ответ, в котором есть общие шаги. Конкретную же реализацию Вам нужно будет написать самостоятельно, т.к. в Вашем вопросе мало деталей.
Задавайте вопрсосы в комментариях ниже, я постараюсь дать Вам ответы и\или дополнить текущий.
Удачи! ;-)