来自Firebase的数据不会自动加载Android Studio

时间:2017-01-28 23:19:31

标签: android android-studio android-recyclerview firebase-realtime-database android-adapter

我已经尝试了adapter.notifyDataSetChanged();以及我在网上找到的所有其他解决方案,但我的firebase数据没有自动加载,我需要点击编辑文本框来加载数据。请有人指导我如何解决这个问题。感谢。

我的适配器看起来像:

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    Context c;
    ArrayList<Spacecraft> spacecrafts;
    public MyAdapter(Context c, ArrayList<Spacecraft> spacecrafts) {
        this.c = c;
        this.spacecrafts = spacecrafts;
    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v=LayoutInflater.from(c).inflate(R.layout.model,parent,false);
        return new MyViewHolder(v);
    }
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        final  Spacecraft s=spacecrafts.get(position);
        holder.nameTxt.setText(s.getName());
        holder.propTxt.setText(s.getPropellant());
        holder.descTxt.setText(s.getDescription());
        holder.setItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClick(int pos) {
                //OPEN DETAI ACTIVITY
                openDetailActivity(s.getName(),s.getDescription(),s.getPropellant());
            }
        });
    }
    @Override
    public int getItemCount() {
        return spacecrafts.size();
    }
    //OPEN DETAIL ACTIVITY
    private void openDetailActivity(String...details)
    {
        Intent i=new Intent(c,DetailActivity.class);
        i.putExtra("NAME_KEY",details[0]);
        i.putExtra("DESC_KEY",details[1]);
        i.putExtra("PROP_KEY",details[2]);
        c.startActivity(i);
    }
}

这就是我从firebase中读取数据的方式

public class FirebaseHelper {
    DatabaseReference db;
    Boolean saved=null;
    ArrayList<Spacecraft> spacecrafts=new ArrayList<>();
    public FirebaseHelper(DatabaseReference db) {
        this.db = db;
    }
    //WRITE IF NOT NULL
    public Boolean save(Spacecraft spacecraft)
    {
        if(spacecraft==null)
        {
            saved=false;
        }else
        {
            try
            {
                db.child("Spacecraft").push().setValue(spacecraft);
                saved=true;
            }catch (DatabaseException e)
            {
                e.printStackTrace();
                saved=false;
            }
        }
        return saved;
    }
    //IMPLEMENT FETCH DATA AND FILL ARRAYLIST
    private void fetchData(DataSnapshot dataSnapshot)
    {
        spacecrafts.clear();
        for (DataSnapshot ds : dataSnapshot.getChildren())
        {
            Spacecraft spacecraft=ds.getValue(Spacecraft.class);
            spacecrafts.add(spacecraft);
        }
    }
    //READ THEN RETURN ARRAYLIST
    public ArrayList<Spacecraft> retrieve() {
        db.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);
            }
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                fetchData(dataSnapshot);
            }
            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
            }
            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
        return spacecrafts;
    }
}

在我的主要活动中,我正在设置这样的adpater:

db= FirebaseDatabase.getInstance().getReference();
FirebaseHelper = new FirebaseHelper(db);
adapter = new MyAdapter(getActivity(), FirebaseHelper.retrieve());
adapter .notifyDataSetChanged();
recycler.setAdapter(adapter );
adapter .notifyDataSetChanged();

我尝试在许多地方和类中放置 adapter.notifyDataSetChanged(); ,但没有运气。任何帮助都会很好,因为这真的让我退缩了,而且一直困扰着我一段时间。谢谢,如果我能提供更多代码,请告诉我。

1 个答案:

答案 0 :(得分:0)

在Firebase中读取数据是异步的。所以从技术上讲,当它仍为空时,你返回spacecrafts(因为数据读取仍然是异步发生的)。我建议您查看FirebaseUI for Android,因为它可以轻松帮助您将数据与RecyclerView同步。