如何在不监听事件的情况下从 firebase 数据库中检索数据

How to retrieve data from firebase database without listening for events

你好,我正在为我的 android app.I 使用 Firebase 数据库,我的数据存储在 firebase 数据库中,我想在创建片段时获取它,但是当我启动我的应用程序时,方法(从 firebase 数据库获取数据)returns null 每当我使用 android 设备恢复片段时,recyclerView 就会填充来自 firebase 的数据。 我的问题是为什么列表 returns 第一次为空。以及如何在创建片段时获取数据

优惠片段

 @Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View offersView = inflater.inflate(R.layout.fragment_offers, container, false);

    mOffersRecyclerView = offersView.findViewById(R.id.rv_offers);
    mAddCard = offersView.findViewById(R.id.fab_add_card);

    setUp();

    return offersView;
}

@Override
public void setPresenter(OffersContract.Presenter presenter) {
    mPresenter = presenter;
}

@Override
public void setUp() {
    mOffersList = mPresenter.getOffersList();
    mOffersAdapter = new OffersAdapter(getActivity(), mOffersList);

    mOffersRecyclerView.setAdapter(mOffersAdapter);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    mOffersRecyclerView.setLayoutManager(layoutManager);
    mOffersRecyclerView.setHasFixedSize(false);

    performActions(mAddCard);
}

OffersPresenter

 @Override
public List<Offers> getOffersList() {

    return databaseHelper.getOffers();
}

DatabaseHelper -> getOffers()

public List<Offers> getOffers() {
    DatabaseReference offerReference = getDatabase().child("offers");

    offerReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            final Iterable<DataSnapshot> children = dataSnapshot.getChildren();

            for (DataSnapshot d : children) {
                offersList.add(d.getValue(Offers.class));
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return offersList;
}

firebase 回调是异步的,因此方法 getOffers 在被回调更新之前将 return 为 null。 您必须将适配器实例和列表实例传递给 firebase 回调,以便它从那里更新 试试这个机制: 在您的 activity 中初始化您的列表

@Override
public void setUp() {
    mOffersList = new ArrayList<Offers> ();
    mOffersAdapter = new OffersAdapter(getActivity(), mOffersList);

    mOffersRecyclerView.setAdapter(mOffersAdapter);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
    mOffersRecyclerView.setLayoutManager(layoutManager);
    mOffersRecyclerView.setHasFixedSize(false);

    performActions(mAddCard);
}

更新您的 getter

@Override
public void getOffersList(List<Offers> offers, OffersAdapter adapter) {

    return databaseHelper.getOffers(offers, adapter);
}

助手会是这样的:

public void getOffers(List<Offers> offers,OffersAdapter adapter) {
    if (offers == null) offers = new ArrayList<Offers> ();
    DatabaseReference offerReference = getDatabase().child("offers");

    offerReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            final Iterable<DataSnapshot> children = dataSnapshot.getChildren();

            for (DataSnapshot d : children) {
                offers.add(d.getValue(Offers.class));
            }
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

请记住,您正在使用值事件,如果有任何数据更改,该事件将被调用,因此数据将被多次添加。如果有问题,请使用单值事件或子事件侦听器来解决。

它 return 为空,因为您将 return offersList; 放在 public List<Offers> getOffers() 的末尾删除 return 语句并使 getOffers() void 并将逻辑添加到 Get/Update 您的数据 and/or commit() 您在 onDataChange(DataSnapshot dataSnapshot) 内的片段,因此当第一个获取数据时它将 return 您的列表时间。

我通常做的是提交片段或在 onDataChange(DataSnapshot dataSnapshot)