提问者:小点点

检查列表中的一个项目,如果日期与当前日期一致,则删除该项目


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

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

List是私有数组List列表; 其中包含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")

共1个答案

匿名用户

将侦听器附加到/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。 使用这样的名称,当您正在做一些不合逻辑的事情时,就像在本例中那样:尝试从用户快照中读取事件数据,这样就更容易识别了。