【问题标题】:Problem in querying firebase recyclerView查询firebase recyclerView的问题
【发布时间】: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


    【解决方案1】:

    我会说你不应该先读取数据然后在你的onBindViewHolder()中设置onClickListener

    首先将onClickListener设置为项目,然后在项目的onClick上读取数据并传递它们:

    不要这样做:

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

    这样做:

     ........
     ........
    
    //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);
    
    //now you set the onClickListener:
    
    eventsViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    
    //here you read the data that you need to pass
    
    
    NewEventsRef.child(eventIDs).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot){
    if (dataSnapshot.exists()){
    
    //get the data
    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);
    
    //pass the data and open new activity
    Intent intent = new Intent(WorkerMyEventActivity.this, WorkerMyEventDetailsActivity.class);
    intent.putExtra("Eid", Eid);
    intent.putExtra("sC", serve);
    startActivity(intent);
    
    }else{
    .....................
    .....................
    }
    
    }
    
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError){
    progressDialog.dismiss();
    }
    
    
    });
    
    
    }
    }); //end of the click listener of the item
    
     ..................
     .................
    

    【讨论】:

    • 如果我应用了这意味着只有当我点击该项目时,它才会在其中显示项目详细信息或内容,如果我再次点击它将转到下一页,但现在它将显示详细信息。而不是我得到了一些想法,我在 singleValueEventListener() 之外使用了那个 onclick 监听器,我已经在 singleValueEventListener() 内部使用了它,现在它工作得很好。无论如何我都是因为你才得到这些想法,非常感谢兄弟。
    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多