【发布时间】:2020-05-23 10:06:35
【问题描述】:
我是 android 开发的新手,目前我面临的问题是在查询 firebase recyclerView 适配器以对日期进行排序时,该页面中的一切正常,但是当单击特定事件并转到下一页时,一些数据丢失或故障,请看下面的代码,
EventsRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
if (dataSnapshot.exists())
{
for (DataSnapshot ds : dataSnapshot.getChildren())
{
String eventId = ds.child("eid").getValue(String.class);
String serveCount = ds.child("serve").getValue(String.class);
list.add(eventId);
list3.add(serveCount);
}
if (list.size() != 0)
{
RecyclerView();
}
}
else
{
progressDialog.dismiss();
TextView txt = (TextView) findViewById(R.id.txt);
txt.setVisibility(View.VISIBLE);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void RecyclerView()
{
DatabaseReference MyEventsRef = FirebaseDatabase.getInstance().getReference();
Query ref = MyEventsRef.child("Workers Details").child(userID).child("My Events").orderByChild("sort_Date");
//Display events
FirebaseRecyclerOptions<WorkerMyEvents> options =
new FirebaseRecyclerOptions.Builder<WorkerMyEvents>()
.setQuery(ref, WorkerMyEvents.class)
.build();
FirebaseRecyclerAdapter<WorkerMyEvents, WorkerMyEventViewHolder> firebaseRecyclerAdapter
= new FirebaseRecyclerAdapter<WorkerMyEvents, WorkerMyEventViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull final WorkerMyEventViewHolder eventsViewHolder, int i, @NonNull final WorkerMyEvents newEvents)
{
//Id with date and time key
final String IDs = getRef(i).getKey();
final String eventIDs = IDs.substring(0,18);
final String serve = list3.get(i);
NewEventsRef.child(eventIDs).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
if (dataSnapshot.exists())
{
progressDialog.dismiss();
final String serveCount = serve;
final String Eid = dataSnapshot.child("Eid").getValue().toString();
final String FromDate = dataSnapshot.child("Total Service Dates").child("From").getValue().toString();
final String ToDate = dataSnapshot.child("Total Service Dates").child("To").getValue().toString();
eventsViewHolder.eventType.setText(event);
eventsViewHolder.totalAmount.setText(FromDate + " - " + ToDate);
eventsViewHolder.ServeCount.setText(serveCount);
eventsViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(WorkerMyEventActivity.this, WorkerMyEventDetailsActivity.class);
intent.putExtra("Eid", Eid);
intent.putExtra("sC", serve);
startActivity(intent);
}
});
eventsViewHolder.opt_out.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
DeletingEvent(IDs, Eid, serve);
}
});
eventsViewHolder.cash_received.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
}
});
}
else
{
progressDialog.dismiss();
//notify to the participants...
//random key
SimpleDateFormat formatter = new SimpleDateFormat("ddMMYYYY");
Date date = new Date();
String tdyDate = formatter.format(date);
Calendar calendar = Calendar.getInstance();
SimpleDateFormat currentTime = new SimpleDateFormat("HHmma");
String saveCurrentTime = currentTime.format(calendar.getTime());
String randomkey = tdyDate + saveCurrentTime;
//random key
String Notify = "The event you participated has been deleted by contractor";
HashMap<String,Object> map = new HashMap<>();
map.put("message", eventIDs + " - " + Notify);
workerRef.child("Notifications").child(randomkey).updateChildren(map);
workerRef.child("Notifications").child("current_counts").child(randomkey).updateChildren(map);
//remove Live event event id's from database...
EventsRef.child(eventIDs).removeValue();
TextView txt = (TextView) findViewById(R.id.txt);
txt.setVisibility(View.VISIBLE);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
progressDialog.dismiss();
}
});
}
@NonNull
@Override
public WorkerMyEventViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.worker_my_event_layout, parent, false);
WorkerMyEventViewHolder holder = new WorkerMyEventViewHolder(view);
return holder;
}
};
recyclerView.setAdapter(firebaseRecyclerAdapter);
firebaseRecyclerAdapter.startListening();
这是我的代码在当前活动中一切正常。但是在执行此操作时 [ Query ref = EventsRef.orderByChild("Sort_Date"); ] 一些数据或参考问题出现在下一页。
下一个活动(); //我面临问题的代码
ref3Male = FirebaseDatabase.getInstance().getReference().child("New Events")
.child(EventId).child("Live Event Details").child("Live counts")
.child("Male").child(serveCount).child("Ids and Details");ref3Male.child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
if (dataSnapshot.exists())
{
//This needs to come ,if that query is not applied in the previous activity this works fine. but while using that it is not working, its movingto else part.
}
else{
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
实际上,在上面的代码中,如果查询未在以前的活动中应用,则 dataSnapShot 将存在,但是在使用它时它会转到其他部分,请指导我在哪里做错了朋友。提前致谢。
模型类
public class WorkerMyEvents
{
private long sort_Date;
public WorkerMyEvents() {
}
public WorkerMyEvents(long sort_Date) {
this.sort_Date = sort_Date;
}
public long getSort_Date() {
return sort_Date;
}
public void setSort_Date(long sort_Date) {
this.sort_Date = sort_Date;
}
}
通过使用上述数据库结构,我将通过对日期进行排序来获取键,并通过使用键,我将从该数据库结构下面的节点获取详细信息,(我只发布了一个节点结构,但它会有很多)
第二个图像参考是我在下一个活动()中使用的..
现在我也注意到并使用时间戳将该日期类型从字符串更改为长类型,但仍然存在这个问题......
我还研究了一些东西,并注意到在活动 1 中将在回收站视图中有项目列表,因为只有第一个和第二个事件只有这个问题,其余的工作正常,当我点击那个事件时,这些细节在下一页查看。
现在我注意到活动 1 中有另一件事,对于第一个两个项目,参考不起作用(参考 - 在第一张图像中),其余的工作正常。
【问题讨论】:
标签: android firebase-realtime-database android-recyclerview