gpt4 book ai didi

java - 我正在更新 Firebase 中一个对象的子对象,然后使用事件监听器拉取同一对象,但它没有更新 UI?

转载 作者:行者123 更新时间:2023-12-02 00:35:26 25 4
gpt4 key购买 nike

这是一个简单的聊天应用程序,能够在聊天室中向其他人请求乘车。请求搭车的人可能会收到多个搭车报价。因此,当有人提供乘车服务时,我想更新在数据库中创建的乘车服务:

Firebase - rideRequest

我正在更新数据库,但是当我使用 valueeventlistener 拉取rideRequest 时,它不会更新 UI。这是代码:

    dbRef.child("rideRequest/" + chatID).child(user.getUid()).child("offers").child(currentUser.getUid()).setValue(currentUser);

dbRef.child("rideRequest/" + chatID).child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

boolean isAccepted;
if ( dataSnapshot.getValue(Ride.class).getOffers() != null) {
isAccepted = false;
} else {
isAccepted = true;
}

ride = dataSnapshot.getValue(Ride.class);

在我将ride.getOffers() 放入其中之后,它也让我对ride.getOffers() 为空感到不满。任何有关更好的方法来处理此问题的建议将不胜感激。

编辑 9/20/2019:抱歉,我现在意识到我根本不需要在该位置进行数据库调用。相反,我只需要将优惠添加到现有的行程中即可。我遇到了另一个我没有考虑到的问题。我通过 bundle 传递对象,以便不必等待数据库调用来获取数据以供查看,但 bundle 变得太大,因为 Android 有大小限制,这是有道理的。因此,我将数据库调用移至单独的 fragment 中,并将后面的任何代码放入回调中。

我只是将进行数据库调用所需的 key 以及对用户角色的任何检查传递给 fragment ,然后将优惠放入数据库并使用 onSuccessCallback 监听器转发数据。这就是我所做的:

    HashMap<String,Object> map = new HashMap<>();
map.put(currentUser.getUid(),currentUser);

dbRef.child("rideRequest/" + chatID).child(user.getUid()).child("offers").updateChildren(map)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
//Create bundle of necessary info to send to rider bottom view
Bundle b = new Bundle();
b.putString("riderKey", user.getUid());
b.putString("currentUser", currentUser.getUid());
b.putString("chatID", chatID);
b.putString("requester", user.getUid());
b.putBoolean("isAccepted", false);
b.putBoolean("isDriver", true);

// Create new page for drivers view to display rider name, loc., dest.,
// Note: Waiting for accept from rider, and a cancel button
RiderBottomView rideBottom = new RiderBottomView();
rideBottom.setArguments(b);
FragmentTransaction f = getSupportFragmentManager().beginTransaction();
f.replace(R.id.rider_bottom, rideBottom, "rider_coming");
f.addToBackStack("user_ride_bottom");
f.commit();
}
});

这是 RiderBottomView onCreateView:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view =inflater.inflate(R.layout.fragment_rider_bottom_view, container, false);
// Get info from RideInfo
Bundle b = getArguments();

userKey = b.getString("currentUser");
chatID = b.getString("chatID");
requester = b.getString("requester");
isDriver = b.getBoolean("isDriver");
isAccepted = b.getBoolean("isAccepted");

// Set text and button to invisible
waitMsg = view.findViewById(R.id.tv_waitonaccept);
btnEnd = view.findViewById(R.id.btn_end);
waitMsg.setVisibility(View.GONE);
btnEnd.setVisibility(View.GONE);

dbRef.child("users/" + requester).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
rider = dataSnapshot.getValue(User.class);
}

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

}
});

dbRef.child("rideRequest/" + chatID + "/" + requester).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

ride = (Ride) dataSnapshot.getValue(Ride.class);
// I call loadText() to load view
loadText(ride, isDriver, isAccepted);

if ( ride.getDriver() != null && currentUser.getUid().equals(ride.getDriver().getUid()) ) {
btnEnd.setVisibility(View.VISIBLE);
waitMsg.setVisibility(View.GONE);

}
if ( ride.isComplete() ) {
dbRef.child("rideRequest/" + chatID).child(requester).removeValue();
returnToChatroom(chatID);
}

}

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

}
});

return view;
}

我创建了一个方法 loadText() 来加载在获取游乐设施后放置在数据库回调中的 textView。这是我的 loadText() 方法:

public void loadText( Ride ride, boolean isDriver, boolean isAccepted ) {

TextView userName = view.findViewById(R.id.rider_bottom_full_name);
TextView pickUp = view.findViewById(R.id.rider_bottom_pu_loc);
TextView dropoff = view.findViewById(R.id.rider_bottom_dropoff_loc);
TextView eta = view.findViewById(R.id.rider_bottom_eta_pu);

if ( isDriver && !isAccepted) {

waitMsg.setVisibility(View.VISIBLE);
userName.setText(rider.getFirstName() + " " + rider.getLastName());
pickUp.setText(ride.getStartAddress());
dropoff.setText(ride.getEndAddress());
eta.setVisibility(View.GONE);

} else if ( isDriver && isAccepted ) {

waitMsg.setVisibility(View.GONE);
btnEnd.setVisibility(View.VISIBLE);
userName.setText(rider.getFirstName() + " " + rider.getLastName());
pickUp.setText(ride.getStartAddress());
dropoff.setText(ride.getEndAddress());
eta.setVisibility(View.VISIBLE);

} else if ( !isDriver && isAccepted ) {

waitMsg.setVisibility(View.GONE);
userName.setText(rider.getFirstName() + " " + rider.getLastName());
pickUp.setText(ride.getStartAddress());
dropoff.setText(ride.getEndAddress());
eta.setVisibility(View.VISIBLE);

}
}

不确定这是否是等待数据库数据的正确或首选方式,因此如果有人有建议,我将非常感谢您的反馈。

最佳答案

dataSnapshot.child("rider").child("offer").getValue().toString() != null

试试这个。
我不知道里面的车手名单是什么。在这个数据库中,有 3 个父级和 4 个子级,因此如果您想以这种方式访问​​这些子级值,也不能创建 list<offers/rider/startLoc/endLog>在您的骑行类别中。

关于java - 我正在更新 Firebase 中一个对象的子对象,然后使用事件监听器拉取同一对象,但它没有更新 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57981732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com