Удаление данных CardView из пользовательского интерфейса и базы данных Firebase в реальном времени?

# #java #android #firebase #firebase-realtime-database #android-recyclerview

Вопрос:

У меня есть RecyclerView CardViews данные, которые поступают из моей базы данных Firebase в реальном времени для различных видов деятельности, например, ежедневного питания. Я добавил кнопку удаления, в CardView которую я хотел бы реализовать функцию удаления из пользовательского интерфейса и базы данных. Я знаю, как сделать это по отдельности, но я не уверен, как обновить базу данных после удаления CardView из пользовательского интерфейса.

В данный момент он удаляется из пользовательского интерфейса, но не из базы данных, поэтому , когда я возвращаюсь к activity нему, карта появляется снова. У каждого приема пищи есть свой собственный случайный идентификатор, не уверен, что это имеет значение, но подумал, что это важно отметить.

Функция Удаления Адаптера:

     foodHolder.deleteMeal.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            meals.remove(position);
            notifyDataSetChanged();
        }
    });
 

Активность приема пищи (где установлен адаптер):

 mealRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {

        @Override
        public void onComplete(@NonNull Task<DataSnapshot> task) {
            if (task.isSuccessful()) {
                int total = 0;
                for (DataSnapshot mealSnapshot : task.getResult().getChildren()) {
                    String grams = mealSnapshot.child("grams").getValue(String.class);

                    if (grams == null) {
                        textViewFoodCounter.setText("0");
                    } else {
                        total  = Integer.parseInt(grams);
                        textViewFoodCounter.setText(String.valueOf(total));
                    }

                    if (meals != null) {
                        noMealsImg.setVisibility(View.GONE);
                        noMealsText.setVisibility(View.GONE);
                    } else {
                        noMealsImg.setVisibility(View.VISIBLE);
                        noMealsText.setVisibility(View.VISIBLE);
                    }

                    progressBar.setMax(1000); // make dynamic
                    ObjectAnimator.ofInt(progressBar, "progress", Integer.parseInt(grams))
                            .setDuration(300)
                            .start();

                    Meal data = mealSnapshot.getValue(Meal.class);
                    meals.add(data);
                }

                foodAdapter = new FoodAdapter(meals);
                foodRecyclerView.setAdapter(foodAdapter);
            } else {
                Log.d("TAG", task.getException().getMessage());
            }
        }
    });
 

Вид карты:

введите описание изображения здесь

Иерархия питания на базе Firebase:

введите описание изображения здесь

Комментарии:

1. Если вы подумываете в какой-то момент попробовать использовать Cloud Firestore , вот несколько полезных статей, которые могут вам помочь. Как удалить запись из Firestore при повторном просмотре проведите пальцем влево/вправо и как удалить несколько записей из Firestore с помощью множественного выбора RecyclerView .

2. Спасибо @AlexMamo, да, я закончил тем, что последовал учебнику на YouTube, чтобы преобразовать мой RecyclerView в FirebaseRecyclerView, и разработчик провел пальцем, чтобы удалить, а также нажал кнопку 🙂 Очень сложно, но в конце концов добрался!

3. Приятно это слышать. Если вы нашли решение, вы могли бы подумать о том, чтобы ответить на свой собственный вопрос. так что будущие разработчики могут извлечь из этого выгоду.

4. Я буду да, хорошая идея! Сделаю это как-нибудь сегодня 🙂

Ответ №1:

Вы можете сделать что-то подобное. Если что-либо обновляется в базе данных firebase, вы можете загрузить свои новые данные с помощью addValueEventListener и onDataChange.

     FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance().reference;
    DatabaseReference dmoRef = firebaseDatabase.getReference().child(serialId);

    dmoRef.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {

                
            
           //get your updated data


            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(getApplicationContext(), "Error fetching data", Toast.LENGTH_LONG).show();
        }
    });
 

Комментарии:

1. Спасибо за ваш ответ, проблема у меня в том, что он не удаляется из базы данных, только пользовательский интерфейс.. Я не знаю, как удалить из базы данных через адаптер..

2. Вы не удаляете данные из базы данных firebase. при нажатии на кнопку удаления держателя представления отображается уникальный идентификатор или имя. Тогда вы можете сделать это вот так. ` val mRealtimeDatabaseRoot = FirebaseDatabase.getInstance().ссылка на mRealtimeDatabaseRoot.дочерний(уникальный идентификатор).removeValue() `

3. Я не знаю, как удалить его из действия.. Я не могу получить ссылку на базу данных в своем классе адаптера, чтобы использовать кнопку удалить.. если в этом есть смысл? @Анварчоудхури

4. добавьте это оттуда ,откуда вы хотите отправить, в поле держатель представления — (просмотр.контекст как моя активность). Удалить фрагмент(уникальный идентификатор)

5. получите это в действии и удалите данные , добавьте это в действие— fun deleteMeal(UniqueID: Строка) { val mRealtimeDatabaseRoot = FirebaseDatabase.getInstance().ссылка на mRealtimeDatabaseRoot.child(UniqueID).removeValue() }