Ну, спецификация файла класса . говорит:
Дескриптор метода действителен только в том случае, если он представляет параметры метода с общей длиной 255 или менее, где эта длина включает в себя вклад для этого в случае вызова метода экземпляра или интерфейса. Суммарная длина рассчитывается путем суммирования вкладов отдельных параметров, где параметр типа long или double вносит два блока в длину, а параметр любого другого типа вносит один блок.
Чтобы удалить узел из базы данных Firebase Realtime, вам нужна ссылка на его точный, полный путь. У вас есть такие ссылки при загрузке данных. Например, в onDataChange
вы можете удалить каждый узел с помощью:
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
//Booking b = dataSnapshot1.getValue(Booking.class);
dataSnapshot1.getRef().removeValue();
}
}
Конечно, это не то, что вы хотите сделать , но это показывает, как удаление из Firebase работает. Вам необходимо знать полный путь узла, который вы пытаетесь удалить, включая ключ этого дочернего узла.
В своем слушателе вы получаете значение от каждого дочернего узла и добавляете его в список, который затем отображаете в адаптере. Но вы не получаете клавишу каждого дочернего узла. Это означает, что в вашем списке / адаптере есть только часть знаний, необходимых для удаления узлов. К тому моменту, когда ваша функция deleteItem
будет вызвана с позицией удаляемого элемента, уже невозможно найти клавишу этого узла.
Таким образом, вам необходимо отслеживать ключи и значения дочерних узлов вашего адаптера. Обычный способ сделать это - сохранить два списка: один с ключами, а другой со значениями.
Итак, сначала вы добавляете List<String>
для ключей к вашему адаптеру:
ArrayList<Booking> bookings;
ArrayList<String> keys;
И принимаете это в конструкторе адаптера:
public MyAdapterBookings(Context c , ArrayList<Booking> b, ArrayList<String> k)
{
context = c;
bookings = b;
keys = k;
}
Затем вы добавляете каждый ключ в onDataChange
:
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Log.d(TAG, "populating recyclerview");
list = new ArrayList<Booking>();
List<String> keys = new ArrayList<String>();
for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
Booking b = dataSnapshot1.getValue(Booking.class);
list.add(b);
keys.add(dataSnapshot1.getKey());
}
adapter = new MyAdapterBookings(CustomerProfile.this, list, keys);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
И, наконец, вы можете найти ключ для удаляемого элемента:
public void deleteItem(int position){
String key = keys.get(position);
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Booking");
ref.child(key).removeValue();
}