代码之家  ›  专栏  ›  技术社区  ›  kemblekaran

如何在不侦听事件的情况下从firebase数据库检索数据[重复]

  •  2
  • kemblekaran  · 技术社区  · 7 年前

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

    要约碎片

     @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);
    }
    

    报价人提交人

     @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;
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Umar Hussain    7 年前

    firebase回调是异步的,因此 getOffers 将在通过回调更新之前返回null。 您必须将适配器实例和列表实例传递给firebase回调,以便从那里进行更新 尝试以下机制: 在活动中初始化列表

    @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) {
    
            }
        });
    }
    

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

        2
  •  1
  •   Guanaco Devs    7 年前

    它返回null,因为您正在放置 return offersList; 在…的结尾 public List<Offers> getOffers() 删除return语句并使 getOffers() void 并添加逻辑以获取/更新数据和/或 commit() 你体内的碎片 onDataChange(DataSnapshot dataSnapshot) ,因此它将在第一次提取数据时返回您的列表。

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