如何在Android的RecyclerView中显示Firebase节点中的所有子项?

时间:2017-01-17 10:13:27

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

我有一个简单的Firebase数据库,如下所示:

enter image description here

我想将所有这些名称显示在RecyclerView中。这是我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);

我还创建了一个CustomFirebaseAdapter extends RecyclerView.Adapter<CustomFirebaseAdapter.ViewHolder>。这是我的onBindViewHolder方法:

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

问题是,我的RecyclerView中只显示了最后一项。如何显示RecyclerView中的所有项目?

提前致谢!

2 个答案:

答案 0 :(得分:2)

您必须从addValueEventListener中提取onBindViewHolder,并且在此方法中仅设置持有者。最后,您还可以使用ChildEventListener例如:

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

我遇到了同样的问题并以这种方式解决了这个问题:example

经过一些调试我们发现问题是,在更改为match_parent一切正常后,项目布局从父wrap_content占用了整个空间。

答案 1 :(得分:0)

我认为你应该写一个单独的转换器,它实际上转换了onDataChange()方法中的数据。然后将其传递给在RecycleView

上保留引用的演示者
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    assets = AssetConverter.convert(dataSnapshot);
    gridPresenter.populate(assets);
}

其中gridPresenter是您在RecycleView及其适配器上保存引用的类。

public void populate(List<Asset> assets) {
    adapter.setData(assets);
    adapter.notifyDataSetChanged();
}