Ответ от @ mark922 имеет суть, но вам понадобится еще несколько шагов.
При удалении сообщения из базы данных вы получите DataSnapshot
этого удаленного сообщения в onChildRemoved
.Вам необходимо:
- Найти соответствующее сообщение в вашем
messageList
. - Удалить сообщение из списка.
- Позвонить
mAdapter.notifyDataSetChanged()
, чтобы сделатьАдаптер перерисовывает представление списка / переработчика.
Хитрый бит - это шаг 1, потому что это означает, что вам нужно найти сообщение.Самый простой способ сделать это - сохранить DataSnapshot.getKey()
для каждого сообщения.Поскольку ключ каждого дочернего узла должен быть уникальным, гарантированно будет только одно сообщение для каждого ключа.
Простой способ добавить это в текущий код - добавить keyList
:
List<String> keyList = new ArrayList<String>();
А затем добавьте ключ каждого DataSnapshot
в этот список, когда вы добавляете значение t messageList
:
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Message message = dataSnapshot.getValue(Message.class);
messageList.add(message);
keyList.add(dataSnapshot.getKey());
mAdapter.notifyDataSetChanged();
}
Теперь у вас есть keyList
и messageList
и элементы в каждом индексе соответствуют друг другу.Таким образом, ключ в keyList[0]
соответствует значению в messageList[0]
и т. Д.
Это означает, что в onChildRemoved
вы можете найти индекс для сообщения, которое было удалено в keyList
, а затем удалитьэто сообщение от messageList
и keyList
на основе индекса:
public void onChildRemoved(DataSnapshot dataSnapshot) {
int index = keyList.indexOf(dataSnapshot.getKey());
messageList.remove(index);
keyList.remove(index);
mAdapter.notifyDataSetChanged();
}
Примечание о вставке сообщений
Приведенный выше код работает, только если новые сообщения всегда добавляются в конециз списка.В простом приложении чата это может быть правдой.Но в более развитых приложениях вы также можете вставить данные в другое место списка.
В этом случае значение String s
, которое передается в onChildAdded
, становится важным, поскольку на самом деле это String previousChildKey
: ключ дочернего элемента до , в который был вставлен новый дочерний элемент.Чтобы правильно обрабатывать этот сценарий, вы должны отслеживать порядок элементов, например, вставляя ключ и значение в правильный индекс в их соответствующие списки.В этот момент вы также захотите обработать onChildChanged
и (что более важно для этого сценария) onChildMoved
.
Все это не невероятно сложно, но довольно легко ошибиться.Я бы рекомендовал взглянуть на класс FirebaseArray
от FirebaseUI в качестве примера / источника вдохновения.