我无法在我的 recyclerview 中检索文件 这是我的代码
运行没有报错..
public class RetrieveActivity extends AppCompatActivity {
RecyclerView rView;
private GridViewAdapter gridViewAdapter;
DatabaseReference databaseReference;
List<uploadPDF> uploadPDFS;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_retrieve);
rView = (RecyclerView) findViewById(R.id.recycler_View);
databaseReference = FirebaseDatabase.getInstance().getReference("uploads");
uploadPDFS = new ArrayList<>();
gridViewAdapter = new GridViewAdapter(this, uploadPDFS);
RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2);
rView.setLayoutManager(mLayoutManager);
rView.addItemDecoration(new GridSpacingItemDecoration(2, dpToPx(10), true));
rView.setItemAnimator(new DefaultItemAnimator());
rView.setAdapter(gridViewAdapter);
prepareView();
}
public void prepareView(){
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()){
for(DataSnapshot is : dataSnapshot.getChildren()){
Map<String, String> map = (Map) is.getValue();
String name = map.get("name");
String author = map.get("author");
String imageUrl = map.get("imageUrl");
String url = map.get("url");
uploadPDF uploadPDF = new uploadPDF(name, author, imageUrl, url);
uploadPDFS.add(uploadPDF);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
gridViewAdapter.notifyDataSetChanged();
}
最佳答案
您在数据实际加载之前调用 notifyDataSetChanged
。
在您的 onCreate
中,您创建适配器,将其链接到您的 View ,并为其提供一个(最初为空)数组以进行呈现。届时 Android 将精确地执行此操作:呈现其中没有任何项目的 GridView 。
然后在 prepareView
中,您开始加载数据,并立即调用 notifyDataSetChanged
,它使用空数组重新呈现网格,因为数据尚未加载。然后,一旦该数据返回,您就将其放入数组中。但是由于您从未将新数据告知 Android,因此它永远不会使用新数据重新绘制 View 。
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
uploadPDFS.clear();
if(dataSnapshot.exists()){
for(DataSnapshot is : dataSnapshot.getChildren()){
Map<String, String> map = (Map) is.getValue();
String name = map.get("name");
String author = map.get("author");
String imageUrl = map.get("imageUrl");
String url = map.get("url");
uploadPDF uploadPDF = new uploadPDF(name, author, imageUrl, url);
uploadPDFS.add(uploadPDF);
}
}
gridViewAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
我还:
- 添加了对
uploadPDFS.clear()
的调用。否则,如果基础数据发生任何变化,您最终会得到每个 PDF 的两份副本。试一试,您就会明白我的意思。 - 将
throw databaseError.toException()
添加到onCancelled
中,因为忽略可能的错误不是一个好主意。
另见:
关于java - Firebase Recyclerview 检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58176541/