2017-11-25 7 views
-1

私は簡単なリストを取得する方法を知っていますが、セクション1の学生のリストを望むテキストボックスにユーザーが入力した場合のようにノードが入れ子になっているときに問題を抱えています。示される。 これは簡単なリストのための私のコードです。firebaseからのリストの検索

public class MainActivity extends AppCompatActivity { 
ListView listView; 
DatabaseReference dref; 
ArrayList<String> list=new ArrayList<>(); 
ArrayAdapter<String> adapter; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    listView=(ListView)findViewById(R.id.ListView); 
    adapter=new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,list); 
    listView.setAdapter(adapter); 
    dref= FirebaseDatabase.getInstance().getReference(); 
    dref.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      String value=dataSnapshot.getValue(String.class); 
      list.add(value); 
      adapter.notifyDataSetChanged(); 
     } 

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

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 
      String value=dataSnapshot.getValue(String.class); 
      list.remove(value); 
      adapter.notifyDataSetChanged(); 
     } 

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

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

JSONツリー:

enter image description here

それを行う方法を私に勧めてください。

答えて

0

ChildEventListenerをデータベースのルートに添付するので、onChildAddedが各セクションのスナップショットとともに呼び出されます。したがって、Section1の場合は1回、Section2の場合は1回、Section3の場合は1回です。あなただけの、特定の部分に耳を傾け、そのセクションにリスナーを添付したい場合は

:あなたが唯一のSection1を聴いていることから、上記で

dref= FirebaseDatabase.getInstance().getReference(); 
dref.child("Section1").addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     String key = dataSnapshot.getKey(); 
     int value = dataSnapshot.getValue(Integer.class); 
     list.add(key+": "+value); 
     adapter.notifyDataSetChanged(); 
    } 

、あなたのonChildAddedJerryに一度火となります一度Seanになります。しかし、それらはスナップショットのキーになっているので、コードはgetKey()を使用しています。

一方、すべてのセクションの生徒を表示する場合は、 は、リスナーをルートに保持し、元のスナップショットの下位レベルのプロパティにアクセスする必要があります。このためには、getChild()を使用してプロパティにアクセスするか、getChildren()をループしてすべてのプロパティにアクセスします。

dref= FirebaseDatabase.getInstance().getReference(); 
dref.addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     for (DataSnapshot student: dataSnapshot.getChildren()) { 
      String value=student.getValue(String.class); 
      list.add(value); 
     } 
     adapter.notifyDataSetChanged(); 
    } 
+0

私のリストのように名前と値の両方を表示する方法は、それが唯一のロールを示しているありno.And私は 'のgetKeyを(使用する最初のスニペットを更新ソリューション – fuk

+0

のためにどうもありがとうございました)'と ' getValue(Integer.class) 'を使って名前と値を取得します。 –

関連する問題