【问题标题】:Get random image from Firebase Storage从 Firebase 存储中获取随机图像
【发布时间】:2018-05-07 10:13:50
【问题描述】:

我正在为一个学校项目制作一个应用程序,它基本上是一个旅行帮手。用户可以在主页上看到随机的国家卡片,因此他可以点击并获取有关该国家/地区的更多信息。

我所有的国家卡片图像都存储在名为“countryCardImages”的目录中的Firebase Storage 中。所有图像都有它们所代表的国家/地区的名称,因此我无法使用getName(元数据函数)检索该名称。 问题是,如果我将所有照片从 1 重命名为 n,我可以简单地生成一个随机数并将其连接到链接,这样每次打开 MainActivity 时,它都会生成不同的数字并显示不同的图像。这种方法的问题是,我无法检索国家名称,因为没有地方可以保存该值。所以,我唯一的选择是用它们的国家名称来命名图像。是否有另一种方法可以使用这种“方法”显示随机图像?

数据库结构:

【问题讨论】:

    标签: java android firebase firebase-realtime-database firebase-storage


    【解决方案1】:

    是的。您可以将所有图像 url 存储在 Firebase 实时数据库中,当您想要检索特定数量的随机图像时,请使用我在 post 中的回答。

    假设您有一个如下所示的 Firebase 数据库:

    Firebase-root
       |
       --- imageUrls
              |
              --- HollandImageUrl: true
              |
              --- SpainImageUrl: true
              |
              --- FranceImageUrl: true
              |
              --- //Other Countries
    

    要获取 5 个随机 url,请使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference imageUrlsRef = rootRef.child("imageUrls");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<String> urlList = new ArrayList<>();
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String url = ds.getKey();
                urlList.add(url);
            }
    
            int urlCount = urlList.size();
            int randomNumber = new Random().nextInt(urlCount);
            List<String> randomUrlList = new ArrayList<>();
            for (int i=1; i<=5; i++) {
                randomUrlList.add(urlList.get(randomNumber));
                //Set image to ImageView
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    imageUrlsRef.addListenerForSingleValueEvent(valueEventListener);
    

    根据您的评论和您的数据库结构,请使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference countriesRef = rootRef.child("countries");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<String> urlList = new ArrayList<>();
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String url = ds.child("Image").getValue(String.class);
                urlList.add(url);
            }
    
            int urlCount = urlList.size();
            int randomNumber = new Random().nextInt(urlCount);
            List<String> randomUrlList = new ArrayList<>();
            for (int i=1; i<=5; i++) {
                randomUrlList.add(urlList.get(randomNumber));
                //Set image to ImageView
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    countriesRef .addListenerForSingleValueEvent(valueEventListener);
    

    【讨论】:

    • 那么使用您提供的代码,我将能够检索 5 张图像并将它们显示在我的 ImageView 中?
    • 谢谢@AlexMamo!我对这些 NoSQL 数据库没有经验。这种数据库格式会好吗? link[/link]
    • 是的,请查看我根据您的数据库结构更新的答案。
    • 谢谢,你帮了我很多忙 :) 将图像插入我的 imageview 将类似于 Picasso.with(getContext()).load(_whatDoIPutHere_).into(imgCard3) ?
    • 毕加索图书馆也不错,但我推荐你:Glide for Android.
    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 2020-04-23
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多