繁体   English   中英

检查列表中的项目,如果日期与当前日期匹配则删除项目 Android

[英]Checking an Item in list and delete then item if date matches with current date Android

我有一个这样的数据库,里面有很多事件

在此处输入图像描述

我想将事件的日期与当前日期相匹配,并向用户发送有关该事件的通知。 我对通知部分很清楚。 任何人都可以帮助我如何访问任何事件的 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();
            }
        });
    }

该应用程序不会崩溃,但它不会执行所需的任务。

好的,所以她就是我初始化 ref 的方式

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

您将侦听器附加到/Events 在此之下,您有两个嵌套级别:

  1. "UjgmW3..." ,这似乎是一个用户 ID 或类似的东西。
  2. 然后在下面你有每个事件的"-MBs..."键。

传递给onDataChangeDataSnapshot包含所有事件的数据。 因此,要达到单个事件的级别(上面的#2),您需要先循环遍历每个“用户 ID”快照,然后再循环遍历事件。

就像是:

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();
    }
});

我发现对于这样的情况,为变量赋予语义上有意义的名称确实很有帮助,例如上面的userSnapshoteventSnapshot 有这样的名字,当你在做一些不合逻辑的事情时更容易被发现,比如在这种情况下:尝试从用户快照中读取事件数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM