我已成功显示来自 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());
}
});
}
});
我知道这是一个相当模糊的问题,但仍然请帮助我,因为我在这个问题上停留了很长时间
最佳答案
问题是您为每个 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/