我有一个简单的Firebase数据库,如下所示:
我想将所有这些名称显示在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
中的所有项目?
提前致谢!
答案 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();
}