我有一个这样的数据库,里面有很多事件
我想将事件的日期与当前日期匹配,并向用户发送了有关事件的通知。 我很清楚通知部分。 有没有人可以帮助我如何访问任何事件的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")
将侦听器附加到/events
。 下面有两个嵌套级别:
“ujgmw3.。。”
,它似乎是用户ID或类似的东西。“-mbs.。。”
键,用于每个事件。传递给OnDataChange
的DataSnapShot
包含所有事件的数据。 因此,为了达到单个事件的级别(上面的#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();
}
});
我发现,对于这种情况,给变量赋予语义上有意义的名称确实很有帮助,比如上面的usersnapshot
和eventsnapshot
。 使用这样的名称,当您正在做一些不合逻辑的事情时,就像在本例中那样:尝试从用户快照中读取事件数据,这样就更容易识别了。