2017-08-18 8 views
0
public void readUniversity(){ 
    ChildEventListener uniListener = new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      //Log.d(LOG_TAG, dataSnapshot.getKey()); 
      University uni = dataSnapshot.getValue(University.class); 
      universitieslist.add(uni); //Adding to an ArrayList of type University 
      //Log.d(LOG_TAG, universitieslist.size()+"is the size"); 
      arrayofUniversities.add(uni.getName()); //Adding name of University to list 
      //Log.d(LOG_TAG, adapter.getCount() + " items"); 
      //Log.d(LOG_TAG, arrayofUniversities.size()+" is the size"); 
      adapter.notifyDataSetChanged(); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 

    DatabaseReference uniReference = database.getReference("note-retrieve/Universities"); 
    uniReference.addChildEventListener(uniListener); 
} 

コードはかなり説明的です。私はarrayofUniversitiesリストを使用してスピナーを設定しているので、アダプターが必要です。私は大学の名前でスピナーを移入していますArrayListはonChildAddedの後に要素を失います(Androidスタジオ&Firebase)

私はたとえ私がuniversitieslistとarrayofUniversities内のすべての要素を失うreadUniversity()メソッドを離れるときに私が持っている問題があるuniversitieslist

における大学のオブジェクトを格納しています私のスピナーにはこれらの人が住んでいます。

非常に奇妙なのは、リストにはオブジェクトが格納されている必要があります。

また、私はonCreate()のコードの一番上にアダプタを持っています。

+0

firebaseからデータを取得していますか? –

+0

はい、非常に確かです。データはスピナーに表示されます。さらに、ログのコメントを外すと、リストに追加されているデータが表示されます。リストを空にすると、メソッドを離れると – user8212452

+0

はどこにありますか?問題が発生する可能性があります。 –

答えて

0

この方法を試してください。それは仕事を願っています。.. :)

private Arrylist<University > universityList = new ArryList<>(); 
private Arrylist<String> universitysName = new ArryList<>(); 

mDatabase.getReference().child("path") 
      .addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     if (dataSnapshot != null) { 
      University mUniversity = dataSnapshot.getValue(University 
             .class); 
      universityList.add(mUniversity); 
      universitysName.add(mUniversity.getName); 

     } 
    } 

    @Override 
    public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
    } 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) { 

    } 

    @Override 
    public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 
+0

私は0の大きさのarraylistを得る – user8212452

0

問題はアダプタがので、アダプタが通知されていないされ、その後、データセットを更新していないログを見ることができれば、アダプタであると思われるが、

@Override 
public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
    if (dataSnapshot != null) { 
     University mUniversity = dataSnapshot.getValue(University 
            .class); 
     universityList.add(mUniversity); 
     universitysName.add(mUniversity.getName); 
     //UPDATE YOUR ADAPTER HERE 
     //spinnerAdapter.notifyDataSetChanged(); 

    } 
} 

を変更しかし、私は本当の問題は、あなたの現在の問題の原因だと思いました:あなたはそれぞれの子を取得しています。これを行う方法ですが、すべてのデータが最初に必要なこのケースでは、スピナーに要素が表示される準備ができたら、すべてのリスト要素を1つのクエリで取得する方がよいでしょう。

database.getReference("note-retrieve/Universities")..addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
        University mUniversity = dataSnapshot.getValue(University 
           .class); 
    universityList.add(mUniversity); 
    universitysName.add(mUniversity.getName); 
     //ONCE THIS IS DONE, THEN PASS THE ARRAY TO THE ADAPTER 
       } 
     //The loop here is over, so you can set the adapter with the full list of data/universities 
      } 
      @Override 
      public void onCancelled(DatabaseError databaseError) { 
      } 
     }); 
関連する問題