Android 由于firebase dabase的异步性质,无法从firebase数据库检索数据

Android 由于firebase dabase的异步性质,无法从firebase数据库检索数据,android,asynchronous,arraylist,firebase-realtime-database,android-recyclerview,Android,Asynchronous,Arraylist,Firebase Realtime Database,Android Recyclerview,由于firebase API的异步性质,当我第一次尝试检索数据时,我的ArrayList似乎是空的,第二次尝试加载数据时,其加载正确,下面是与此相关的代码。 用于检索数据的方法 AdvertisementRef.orderByChild("Category").equalTo(categoryS).addValueEventListener(new ValueEventListener() { @Override public void onDataCha

由于firebase API的异步性质,当我第一次尝试检索数据时,我的ArrayList似乎是空的,第二次尝试加载数据时,其加载正确,下面是与此相关的代码。 用于检索数据的方法

    AdvertisementRef.orderByChild("Category").equalTo(categoryS).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                SaveAddInformation mModel = eventSnapshot.getValue(SaveAddInformation.class);
                Log.d("DATA" ,""+ mModel);
                adinfolist.add(mModel);
            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("The read failed: " + databaseError.getMessage());
        }
    });


    return adinfolist;

}
主要活动

     rv.setLayoutManager(new LinearLayoutManager(this));
    rv.setHasFixedSize(true);
    advertismentref= FirebaseDatabase.getInstance().getReference("ADVERTISEMENT INFORMATION");
    helper=new Firebase_helper(advertismentref);
    adapter=new AdvertisementAdapter(helper.retrieve(/*catS*/),this);
    // adapter  = new AdvertisementAdapter(this, helper.retrieve());
    rv.setAdapter(adapter);
ViewHolder和适配器类

public class AdvertisementAdapter extends RecyclerView.Adapter <AdvertisementAdapter.AdvetisementViewHolder>{
ArrayList<SaveAddInformation>saveAddInformations=new ArrayList<SaveAddInformation>();
Context ctx;

public AdvertisementAdapter(ArrayList<SaveAddInformation> saveAddInformations,Context ctx) {
    this.saveAddInformations = saveAddInformations;
    this.ctx=ctx;
}

@Override
public AdvertisementAdapter.AdvetisementViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.design_row,parent,false);
    AdvetisementViewHolder myViewholder=new AdvetisementViewHolder(v,ctx,saveAddInformations);

    return myViewholder;
}

@Override
public void onBindViewHolder(AdvertisementAdapter.AdvetisementViewHolder holder, int position) {

    SaveAddInformation save=saveAddInformations.get(position);
    String title=save.getTitleS();
    holder.titleTv.setText(title);
    String rentamt=save.getRent_amount();
    holder.rentamt.setText(rentamt);
    String rentdays=save.getRentDaysSpin();
    holder.rentdays.setText(rentdays);
    String description=save.getProductDetails();
    holder.desc.setText(description);
    String imguri=save.getImageuri();

    holder.setImage(getApplicationContext(), imguri);



}



@Override
public int getItemCount() {
    return saveAddInformations.size();
}


public static class AdvetisementViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    TextView titleTv,rentamt,rentdays,desc;
    Context ctx;
    ImageView adimg;
    ArrayList<SaveAddInformation>saveAddInformations=new ArrayList<SaveAddInformation>();

    public AdvetisementViewHolder(View itemView,Context ctx,ArrayList<SaveAddInformation>saveAddInformations) {


        super(itemView);
        this.saveAddInformations=saveAddInformations;
        itemView.setOnClickListener(this);
        this.ctx=ctx;


        titleTv=(TextView)itemView.findViewById(R.id.Titletextv);

        rentamt=(TextView)itemView.findViewById(R.id.rent_amount);
        rentdays=(TextView)itemView.findViewById(R.id.days_rent);
        desc=(TextView)itemView.findViewById(R.id.descTV);




    }

    public void setImage(Context applicationContext, String imguri) {

        adimg=(ImageView)itemView.findViewById(R.id.ad_image);

        // We Need TO pass Context

        Picasso.with(applicationContext).load(imguri).into(adimg);

    }
公共类AdvertisementAdapter扩展了RecyclerView.Adapter{
ArrayListSaveAddInformation=新的ArrayList();
上下文ctx;
公共广告适配器(ArrayList SaveAddInformation,上下文ctx){
this.saveAddInformations=saveAddInformations;
这个.ctx=ctx;
}
@凌驾
public AdvertisementAdapter.AdveticementViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.design_行,parent,false);
AdveticementViewHolder myViewholder=新的AdveticementViewHolder(v、ctx、SaveAddInformation);
返回myViewholder;
}
@凌驾
BindViewHolder上的公共无效(AdvertisementAdapter.AdveticementViewHolder,内部位置){
SaveAddInformation save=saveAddInformations.get(位置);
String title=save.getTitleS();
持有者.标题v.setText(标题);
字符串rentam=save.getRent_amount();
holder.rentamt.setText(租金金额);
字符串rentdays=save.getRentDaysSpin();
holder.rentdays.setText(rentdays);
String description=save.getProductDetails();
holder.desc.setText(说明);
字符串imguri=save.getImageuri();
setImage(getApplicationContext(),imguri);
}
@凌驾
public int getItemCount(){
返回saveAddInformation.size();
}
公共静态类AdveticementViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
TextView标题、租金金额、租金天数、说明;
上下文ctx;
图像视图adimg;
ArrayListSaveAddInformation=新的ArrayList();
public AdveticementView文件夹(查看项目视图、上下文ctx、ArrayListSaveAddInformation){
超级(项目视图);
this.saveAddInformations=saveAddInformations;
setOnClickListener(这个);
这个.ctx=ctx;
titleTv=(TextView)itemView.findViewById(R.id.Titletextv);
rentamt=(TextView)itemView.findViewById(R.id.rent\u amount);
rentdays=(TextView)itemView.findViewById(R.id.days\u rent);
desc=(TextView)itemView.findViewById(R.id.descTV);
}
public void setImage(上下文应用程序上下文,字符串imguri){
adimg=(ImageView)itemView.findViewById(R.id.ad_image);
//我们需要传递上下文
毕加索.with(applicationContext).load(imguri).into(adimg);
}

我刚刚将检索方法移动到主活动中,并在onDataChange和onCancelled方法中调用了adapter.notifyDataSetChanged();它起了作用!!!

当您使用接口在just update adapter中获取数据时,可以使用该接口