java - Firebase Recyclerview 检索

标签 java android firebase firebase-realtime-database

我无法在我的 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();
    }

enter image description here

最佳答案

您在数据实际加载之前调用 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/

相关文章:

java - 使用java代码在mac上运行命令

同步调用中的 Android runOnUiThread()

firebase - Cloud Firestore生产数据如何导入本地模拟器?

android - 在 RecyclerView 中显示 firebase 存储图像

java - 如何在 MapStruct 中将相同的 TO 映射到新的相同 TO?

java - 神经网络编程,寻找一个好的简单的游戏来训练网络

java - android 获取用户当前位置

android - 通过 android.widget.RemoteViewsService 访问时的 Content Provider 权限

android - 想在 android 中的 CardView 的卡片之间添加水平间距?

node.js - 即使在 jwt 上,Firebase ID token 的签名也无效