Проверка элемента в списке и удаление элемента, если дата совпадает с текущей датой Android - PullRequest
0 голосов
/ 10 июля 2020

У меня есть такая база данных с множеством событий

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

Я хочу сопоставить дату события с текущей датой и отправил пользователю уведомление о событии. Я все понимаю с уведомлением. Может ли кто-нибудь помочь мне, как получить доступ к list.get (position) .getDate () любого события, не нажимая на элемент в представлении ресайклера.

Я пробовал это

for(int position =0;position<list.size();position++){
Date c = Calendar.getInstance().getTime();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
String formattedDate = df.format(c);
if (list.get(position).getDate().compareTo(formattedDate) == 0) {
    final String itemId2 = list.get(position).getItemId();
    final String strDate = list.get(position).getDate();
    final String strPlace = list.get(position).getDate();
    final String strDesc = list.get(position).getDate();
    final String strName = list.get(position).getName();
    EventDetails eventDetails = new EventDetails(itemId2, strName, strPlace, strDesc, strDate, "0", "0");
    ref3.child(itemId2).setValue(eventDetails).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isComplete()) {
                Toast.makeText(getContext(), "Event completed!", Toast.LENGTH_LONG).show();
            }
        }
    });
    ref.child(itemId2).removeValue();
    Toast.makeText(getContext(), formattedDate, Toast.LENGTH_LONG).show();
}

}

Но это не сработает. Я хочу, чтобы этот код работал автоматически в дату события, а не при однократном или двойном щелчке по recyclerView. Может ли кто-нибудь помочь !!? Обратите внимание, что данные находятся в базе данных firebase.

Список является частным списком ArrayList; который содержит данные eventDetails. java, а подробности события -

public class EventDetails {
private String itemId, name, place, desc, date, alarmHour, alarmMin;

public EventDetails() {
}

public EventDetails(String itemId, String name, String place, String desc, String date, String alarmHour, String alarmMin) {
    this.itemId = itemId;
    this.name = name;
    this.place = place;
    this.desc = desc;
    this.date = date;
    this.alarmHour = alarmHour;
    this.alarmMin = alarmMin;
}

public String getItemId() {
    return itemId;
}

public void setItemId(String itemId) {
    this.itemId = itemId;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPlace() {
    return place;
}

public void setPlace(String place) {
    this.place = place;
}

public String getDesc() {
    return desc;
}

public void setDesc(String desc) {
    this.desc = desc;
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public String getAlarmHour() {
    return alarmHour;
}

public void setAlarmHour(String alarmHour) {
    this.alarmHour = alarmHour;
}

public String getAlarmMin() {
    return alarmMin;
}

public void setAlarmMin(String alarmMin) {
    this.alarmMin = alarmMin;
}

}, и вот как я добавил значения в список и показал в recyclerView

if (ref != null) {
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    list = new ArrayList<>();
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        list.add(ds.getValue(EventDetails.class));
                    }
                    EventAdapter eventAdapter = new EventAdapter(list, getActivity());
                    recyclerView.setAdapter(eventAdapter);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }

Приложение не взламывает sh, но не выполняет желаемую задачу.

Хорошо, вот как я инициализировал ref

private DatabaseReference ref;
ref = FirebaseDatabase.getInstance().getReference().child("Events/"+ + Objects.requireNonNull(FirebaseAuth.getInstance().getCurrentUser()).getUid())

1 Ответ

1 голос
/ 10 июля 2020

Вы прикрепляете своего слушателя к /Events. Под этим у вас есть два вложенных уровня:

  1. "UjgmW3...", который кажется идентификатором пользователя или что-то в этом роде.
  2. , а затем под ним у вас есть "-MBs..." ключи, для каждого события.

DataSnapshot, которое передается вашему onDataChange, содержит данные для всех событий. Таким образом, чтобы перейти на уровень отдельных событий (# 2 выше), вам нужно сначала l oop для каждого снимка "идентификатора пользователя", а затем внутри него над событиями.

Что-то вроде:

ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            list = new ArrayList<>();
            for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
                for (DataSnapshot eventSnapshot: userSnapshot.getChildren()) {
                    list.add(eventSnapshot.getValue(EventDetails.class));
                }
            }
            EventAdapter eventAdapter = new EventAdapter(list, getActivity());
            recyclerView.setAdapter(eventAdapter);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Toast.makeText(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

Я считаю, что для таких случаев действительно помогает дать вашим переменным семантически значимые имена, например userSnapshot и eventSnapshot выше. Наличие таких имен значительно облегчает обнаружение, когда вы делаете что-то нелогичное, как в этом случае: пытаетесь прочитать данные о событиях из пользовательского снимка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...