【问题标题】:Issues in query on recyclerView from firebase [duplicate]从firebase查询recyclerView的问题[重复]
【发布时间】:2020-09-07 00:10:46
【问题描述】:

目前我面临的问题是,在查询 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()
{
    Query ref = EventsRef.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())
                    {
                        //Here will have some data's to display...
                       // I will retrieve Eid from New Events node
                        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.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 将存在,但是在使用它时它会转到其他部分,请指导我在哪里做错了朋友。提前致谢。

通过使用上述数据库结构,我将通过对日期进行排序来获取键,并通过使用键,我将从该数据库结构下面的节点获取详细信息,(我只发布了一个节点结构,但它会有很多)

第二个图像参考是我在下一个活动()中使用的..

现在我也注意到并使用时间戳将该日期类型从字符串更改为长类型,但仍然存在这个问题......

我还研究了一些东西,并注意到在活动 1 中将在回收站视图中有项目列表,因为只有第一个和第二个事件只有这个问题,其余的工作正常,当我点击那个事件时,这些细节在下一页查看。

现在我注意到活动 1 中有另一件事,对于第一个两个项目,参考不起作用(参考 - 在第一张图像中),其余的工作正常。

public class WorkerMyEvents
{
private String Eid;

public WorkerMyEvents() {
}

public WorkerMyEvents(//Here also) {
   //Constructors
}

//Getters and setters

}

【问题讨论】:

  • 请编辑您的问题并将您的数据库结构添加为屏幕截图。
  • 我已经发布并提到了兄弟..第一张图片的一个细微变化是,我使用时间戳将该日期类型从字符串更改为长
  • 请同时添加内容WorkerMyEvents类。
  • 我不知道你为什么要问这个兄弟..但我补充说。因为我只获取键值并使用该键我从另一个节点获取引用并获取详细信息。
  • 课程不完整。请至少添加变量。

标签: android firebase-realtime-database android-recyclerview


【解决方案1】:

我认为您传递的EventID 不正确,请在点击后执行此操作:

eventsViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(WorkerMyEventActivity.this, WorkerMyEventDetailsActivity.class);

//pass the event ID
intent.putExtra("Eid", newEvents.getEid());

//pass other stuff if needed.......

startActivity(intent);
}
});

WorkerMyEventDetailsActivityonCreate()方法中:

//in onCreate()

String eventID = getIntent().getStringExtra("Eid");


//when you want to read the ref

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("New Events");


//read data

ref.child(eventID).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot)
        {
            if (dataSnapshot.exists())
            {
            //this should trigger and then you can get details.......
            }
            else{

            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

【讨论】:

  • 不,兄弟.. Eid 是正确的,因为我在 textview 的下一个活动中显示该 eid。它在那里显示。在节点 newEvents 中,它没有引用我在第二张图片中标记的那个 id,这就是我不知道的。为什么它是......但它只显示第一个两个项目的问题 .. 仍然完美地工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多