java - 从 firebase 获取列表时,特定值仅显示在一个 recyclerview 项目中,但不会显示在列表中显示的其他项目中

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

我已成功显示来自 firebase 的列表,其中显示出价以及所需的距离和持续时间。两个位置存储在 firebase 数据库中,我使用这些位置使用谷歌地图 API 来计算距离和持续时间。我也能够成功获得距离和持续时间。

问题: 该列表显示了 recyclerview 列表中的所有出价,但距离和持续时间仅显示在列表的一项(最近一项)上,所有出价均正确显示

我还尝试在重写方法“taskcompleted”中添加 bidlist.add(bids),但出现了另一个问题,即 recyclerview 多次显示相同的元素

代码:

 getUserFromLoc(users_ref, delivery_id, new UserFromLocationCallback() {
            @Override
            public void userFromLocation(LatLng loc) {
                order_bids.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


                        Log.e("datasnap",""+dataSnapshot);
                        for(DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
                            Bids bids = new Bids();
                            Log.e("datasnap",""+dataSnapshot1);
                            if(dataSnapshot1.child(delivery_id).child("location_lat").getValue()!=null){
                                double d  = (Double) dataSnapshot1.child(delivery_id).child("location_lat").getValue();
                                double lat=Double.parseDouble(dataSnapshot1.child(delivery_id).child("location_lat").getValue().toString());

                                double lng=Double.parseDouble(dataSnapshot1.child(delivery_id).child("location_lng").getValue().toString());
                                LatLng latLng = new LatLng(lat,lng);
                                distance_task.getDirectionsUrl(loc, latLng,getString(R.string.google_maps_key),"driving");
                                bids.setTruck_type(deliveryInfo.getType_of_truck());
                                bids.setDelivery_id(deliveryInfo.getDeliveryID());
                                bid_amt=dataSnapshot1.child(delivery_id).child("bid_value").getValue().toString();
                                Log.e(TAG, "taskCompleted: "+ dataSnapshot1.child(delivery_id).child("bid_value").getValue().toString());
                                bid_amt=dataSnapshot1.child(delivery_id).child("bid_value").getValue().toString();

                                Log.e("Bids data",""+bids.getBid());
                                bids.setBid(bid_amt);
                                bids.setDistance(getDistance(loc, latLng)[0]);
                                bids.setDuration(getDistance(loc, latLng)[1]);
                                bidslist.add(bids);


                                distance_task.setLoadListener(new CalculateDistanceTime.taskCompleteListener() {
                                    @Override
                                    public void taskCompleted(String[] time_distance) {

                                        Log.e("Duration truck","" + time_distance[1]);
                                        Log.e("distance truck","" + time_distance[0]);

                                        truck_distance=time_distance[0];
                                        truck_duration=time_distance[1];

                                        bids.setDuration(truck_duration);
                                        bids.setDistance(truck_distance);



                                        initRecyclerView(bidslist, new BidsClickInterface() {
                                            @Override
                                            public void bidsCLick(View view, int pos) {
                                                Toast.makeText(BidsActivity.this,"click:"+pos,Toast.LENGTH_SHORT).show();
                                            }
                                        },BidsActivity.this);
                                        Log.e(TAG, "Bids_size "+bidslist.size());


                                    }



                                });

                                Log.e("datasnap2","gg1"+d);
                            }else {
                                Log.e("datasnap2","gg2");
                            }



                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        Log.e("error:",""+databaseError.getMessage());

                    }
                });
            }
        });

BidsActivity

我知道这是一个相当模糊的问题,但仍然请帮助我,因为我在这个问题上停留了很长时间

最佳答案

问题是您为每个 dataSnapshot1 调用 initRecyclerView,因此,只有最新的出价会传递到 recyclerview 适配器。 (这是因为您在 for 循环内调用了 initRecyclerView),而是在 for 循环之后调用 initRecyclerView

getUserFromLoc(users_ref, delivery_id, new UserFromLocationCallback() {
    @Override
    public void userFromLocation(LatLng loc) {
        order_bids.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                Log.e("datasnap",""+dataSnapshot);
                for(DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
                    Bids bids = new Bids();
                    Log.e("datasnap",""+dataSnapshot1);
                    if(dataSnapshot1.child(delivery_id).child("location_lat").getValue()!=null){
                        double d  = (Double) dataSnapshot1.child(delivery_id).child("location_lat").getValue();
                        double lat=Double.parseDouble(dataSnapshot1.child(delivery_id).child("location_lat").getValue().toString());

                        double lng=Double.parseDouble(dataSnapshot1.child(delivery_id).child("location_lng").getValue().toString());
                        LatLng latLng = new LatLng(lat,lng);
                        distance_task.getDirectionsUrl(loc, latLng,getString(R.string.google_maps_key),"driving");
                        bids.setTruck_type(deliveryInfo.getType_of_truck());
                        bids.setDelivery_id(deliveryInfo.getDeliveryID());
                        bid_amt=dataSnapshot1.child(delivery_id).child("bid_value").getValue().toString();
                        Log.e(TAG, "taskCompleted: "+ dataSnapshot1.child(delivery_id).child("bid_value").getValue().toString());
                        bid_amt=dataSnapshot1.child(delivery_id).child("bid_value").getValue().toString();

                        Log.e("Bids data",""+bids.getBid());
                        bids.setBid(bid_amt);
                        bids.setDistance(getDistance(loc, latLng)[0]);
                        bids.setDuration(getDistance(loc, latLng)[1]);
                        bidslist.add(bids);


                        distance_task.setLoadListener(new CalculateDistanceTime.taskCompleteListener() {
                            @Override
                            public void taskCompleted(String[] time_distance) {

                                Log.e("Duration truck","" + time_distance[1]);
                                Log.e("distance truck","" + time_distance[0]);

                                truck_distance=time_distance[0];
                                truck_duration=time_distance[1];

                                bids.setDuration(truck_duration);
                                bids.setDistance(truck_distance);

                            }

                        });

                        Log.e("datasnap2","gg1"+d);
                    }else {
                        Log.e("datasnap2","gg2");
                    }

                }
                // Call initRecyclerView after the for loop
                initRecyclerView(bidslist, new BidsClickInterface() {
                    @Override
                    public void bidsCLick(View view, int pos) {
                        Toast.makeText(BidsActivity.this,"click:"+pos,Toast.LENGTH_SHORT).show();
                    }
                    },BidsActivity.this);
                    Log.e(TAG, "Bids_size "+bidslist.size());
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.e("error:",""+databaseError.getMessage());

            }
        });
    }
});

关于java - 从 firebase 获取列表时,特定值仅显示在一个 recyclerview 项目中,但不会显示在列表中显示的其他项目中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57638217/

相关文章:

java - 在 Java 中使层模块化/可扩展

Android: WebView 上的 NullPointerException

firebase - Firestore 导入 - 没有错误,但没有更改

swift - 使 Completionhandler 在 For 循环中工作以获取图像

java - 基于JRadioButton动态更改JPanel

java - 具有 k 个节点的 Dijkstra 变体?

java - 从虚假帐户发送电子邮件

android - 如何在庞大的 Android 代码库中快速找到与小型 UI 组件相关的代码?

android - 设置安卓 :layout_margin for a view through code

android - 如何在 Firebase Analytics 中设置自定义用户操作?