1

私はこのようになり、簡単なFirebaseデータベース持っている:私はRecyclerViewにこのすべての名前を表示したいAndroidのRecyclerViewでFirebaseノードのすべての子を表示するにはどうすればいいですか?

enter image description here

を。これはonCreate方法から私のコードです:

databaseReference = FirebaseDatabase.getInstance().getReference().child("Names"); 
recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
recyclerView.setHasFixedSize(true); 
layoutManager = new LinearLayoutManager(this); 
recyclerView.setLayoutManager(layoutManager); 
adapter = new RoomFirebaseAdapter(databaseReference, this); 
recyclerView.setAdapter(adapter); 

私はextends RecyclerView.Adapter<CustomFirebaseAdapter.ViewHolder>CustomFirebaseAdapterをも作成しました。私RecyclerView

@Override 
public void onBindViewHolder(final RoomFirebaseAdapter.ViewHolder holder, int position) { 
    databaseReference.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot ds : dataSnapshot.getChildren()) { 
       name = ds.getKey(); 
       holder.textView.setText(name); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) {} 
    }); 
} 

問題があり、それが唯一の最後の項目をdisplyedされています。ここに私のonBindViewHolder方法です。 RecyclerViewのすべてのアイテムを表示するにはどうすればよいですか?

ありがとうございます!

答えて

2

あなたはonBindViewHolderからaddValueEventListenerを抽出し、この方法でのみホルダーを設定する必要があります。問題は、アイテムのレイアウトがかかったということだったことを、私たちが見つけたいくつかのデバッグ後example

:私は同じ問題を抱えていたし、それをこのように解決した

private ArrayList<String> names; 

public CustomFirebaseAdapter() { 
    names = new ArrayList<String>(); 
    databaseReference = FirebaseDatabase.getInstance().getReference().child("Names"); 
    updateNames(); 
} 

private void updateNames() { 
    ChildEventListener childEventListener = new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { 
      Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey()); 
      final String name = dataSnapshot.getValue(String.class); 
      names.add(name); 
      notifyItemInserted(getItemCount() - 1); 
     } 
     ... 
    }; 
    databaseReference.addChildEventListener(childEventListener); 
} 

@Override 
public void onBindViewHolder(final TodoViewHolder holder, int position) { 
    final String name = names.get(position); 
    if (name == null) { return; } 

    holder.textView.setText(name); 
} 

:最終的にはあなたもChildEventListenerなどを使用することができますwrap_contentに変更した後、親からの全体のスペースがmatch_parentになりました。

+0

ありがとうございます。しかし、私が 'final String name = getItem(position);を実装しようとすると、' get getem(int) 'メソッドを解決できません。私に何ができる? –

+0

それは何も返しません: 'names.get(position)'もし 'names'があなたの配列なら - 私は答えを更新しました –

+0

これは動作しません。今私は '致命的な例外:主なjava.lang.IndexOutOfBoundsException:無効なインデックス0、サイズは0です'を得た。これは私の[CustomFirebaseAdapter](http://alexmamo.ro/RoomFirebaseAdapter.java)です。名前の代わりに、私は今部屋を持っています。どうして私にすべてのデータが届かないのか分かりませんか? –

0

私はあなたがonDataChange()のメソッドで実際にデータを変換する分離されたコンバータを書くべきだと思います。あなたはgridPresenterがRecycleViewの参照を保持するためにあなたのクラスであり、それはアダプタですRecycleView

@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
    assets = AssetConverter.convert(dataSnapshot); 
    gridPresenter.populate(assets); 
} 

の参照を保持し、あなたのプレゼンターに渡すよりも。

public void populate(List<Asset> assets) { 
    adapter.setData(assets); 
    adapter.notifyDataSetChanged(); 
} 
関連する問題