1

我已經嘗試了一切,但我的數據從firebase沒有自動加載,當我打開應用程序,我不得不點擊一個edittext加載數據。Recylerview不會自動從firebase加載數據Android Studio

我已經試過

adapter.Update(data); 
    recycler.invalidate(); 
    notifyDataSetChanged(); 
    adapter.notifyDataSetChanged(); 

請有人可以幫助我。

編輯:

我保存到火力點是這樣的:

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); 
      } 
     }); 
     return spacecrafts; 
    } 
} 

我viewholder類

public MyViewHolder(View itemView) { 
     super(itemView); 
     nameTxt= (TextView) itemView.findViewById(R.id.nameTxt); 
     propTxt= (TextView) itemView.findViewById(R.id.propellantTxt); 
     descTxt= (TextView) itemView.findViewById(R.id.descTxt); 
     itemView.setOnClickListener(this); 
    } 
    public void setItemClickListener(ItemClickListener itemClickListener) 
    { 
     this.itemClickListener=itemClickListener; 
    } 
    @Override 
    public void onClick(View view) { 
     this.itemClickListener.onItemClick(this.getLayoutPosition()); 
    } 

我的適配器類

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

在我ONC mainactivity reate我打電話這樣

recycler = (RecyclerView) rootView.findViewById(R.id.recycler); 
recycler.setLayoutManager(new LinearLayoutManager(getActivity())); 
database = FirebaseDatabase.getInstance().getReference(); 
spacecraft = new ArrayList<>(); 
firebasehelper = new FirebaseHelper(database); 
adapter = new JAdapter(getActivity(), firebasehelper.retrieve()); 
recycler.setAdapter(adapter); 
+0

發佈您通過其獲取數據的觀察者代碼 –

+0

嗨,我已經粘貼了指向我閱讀firebase數據的教程的鏈接。請讓我知道你是否希望我在這裏粘貼代碼。我寫了完全相同的代碼。 –

+0

發佈您的代碼和您的視頻。不是從你學到的地方 –

回答

0

數據的問題是與retrieve法:它是將一個ChildEventListener執行異步(這意味着它不會阻止,直到孩子數據獲取)立即,然後返回尚未由異步偵聽器代碼填充的spacecrafts列表。

您應該刷新RecyclerView適配器在獲取數據的實際代碼,即在fetchData方法,如:

private void fetchData(DataSnapshot dataSnapshot) 
{ 
    spacecrafts.clear(); 
    for (DataSnapshot ds : dataSnapshot.getChildren()) 
    { 
     Spacecraft spacecraft=ds.getValue(Spacecraft.class); 
     spacecrafts.add(spacecraft); 
    } 
    adapter.spacecrafts = spacecrafts; // update the list in the adapter 
    adapter.notifyDataSetChanged(); // refresh 
} 

在這種情況下,retrieve方法可以有一個void返回類型,因爲它是沒有意義的從中返回列表。

+0

它不重新配置適配器在fetchData –

+0

@JoshJoe我並不打算將我的代碼片段完全按照原樣複製。這個想法是,你應該想辦法從你的'FirebaseHelper'調用適配器。您可以在構造函數中傳遞適配器,也可以將回調接口傳遞給'retrieve'方法,並且在獲取所有子項時調用此回調函數。 – manouti

+0

我一直在玩,但我似乎無法得到它的工作 –

0

使用FirebaseRecyclerAdapter從Firebase加載數據。

0

修改幫手建築工是這樣的:

public FirebaseHelper(Context c, DatabaseReference db, ListView lv) { 
    this.c = c; 
    this.db = db; 
    this.lv = lv; 
} 

之後再將其添加到fetchData方法循環:

if (spacecrafts.size() > 0) 
    { 
     adapter = new CustomAdapter(c, spacecrafts); 
     lv.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
    } 

然後在主活動修改如下:

helper = new FirebaseHelper(this, db, lv); 
    //ADAPTER 
    //adapter = new CustomAdapter(this, helper.retrieve()); 
    //lv.setAdapter(adapter); 
    helper.retrieve(); 

這應該適合你。

0

檢查您是否在onCreate()方法中設置適配器,如果您在onStart()中調用它,則不會自動加載數據。在onCreate()方法中設置適配器。