0

0

从 Firestore 获取图片 URL 并在 BaseAdapter 中显示

心靈之曲

心靈之曲

发布时间:2025-09-10 11:22:33

|

870人浏览过

|

来源于php中文网

原创

从 firestore 获取图片 url 并在 baseadapter 中显示

本文旨在解决 Android 开发中从 Firebase Firestore 获取图片 URL 并在 BaseAdapter 中显示图片的问题。通过结合 Firebase Storage 和 Glide 库,详细讲解如何从 Firestore 获取图片下载链接,并在 BaseAdapter 的 getView() 方法中使用 Glide 加载图片到 ImageView 中。文章提供了代码示例和注意事项,帮助开发者高效地实现图片加载功能。

从 Firestore 获取图片 URL

首先,你需要确保你的 Firebase 项目已经设置好 Firebase Storage,并且图片已经上传到 Storage 中。Firestore 中存储的是图片的引用或下载 URL,而不是图片本身。

要从 Firestore 获取图片 URL,你需要使用 Firebase SDK 提供的 API。假设你的 Firestore 文档中有一个名为 imageUrl 的字段存储了图片的下载 URL,你可以这样获取:

FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference docRef = db.collection("your_collection").document("your_document_id");
docRef.get().addOnCompleteListener(new OnCompleteListener() {
    @Override
    public void onComplete(@NonNull Task task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                String imageUrl = document.getString("imageUrl");
                // 现在你可以使用 imageUrl 来加载图片
            } else {
                Log.d("Firestore", "No such document");
            }
        } else {
            Log.d("Firestore", "get failed with ", task.getException());
        }
    }
});

这段代码首先获取 your_collection 集合中 your_document_id 文档的引用,然后异步获取文档数据。如果文档存在,则从文档中获取 imageUrl 字段的值。

在 BaseAdapter 中使用 Glide 加载图片

获取到图片 URL 后,你需要在 BaseAdapter 的 getView() 方法中使用图片加载库(例如 Glide)来加载图片到 ImageView 中。

以下是修改后的 CustomAdapterLw 示例,展示了如何使用 Glide 加载图片:

Img.Upscaler
Img.Upscaler

免费的AI图片放大工具

下载
package com.example.lazywarriorsapp;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;

public class CustomAdapterLw extends BaseAdapter {

    private ArrayList customListItemsLwArrayList = new ArrayList<>();
    private Context context;

    public CustomAdapterLw(Context context, ArrayList customListItemsLwArrayList) {
        this.context = context;
        this.customListItemsLwArrayList = customListItemsLwArrayList;
    }

    @Override
    public int getCount() {
        return customListItemsLwArrayList.size();
    }

    @Override
    public Object getItem(int position) {
        return customListItemsLwArrayList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.custom_list_item_lw, parent, false);
            holder = new ViewHolder();
            holder.imageView = convertView.findViewById(R.id.defaultImage);
            holder.title = convertView.findViewById(R.id.customlisttitle);
            holder.dongeupmyen = convertView.findViewById(R.id.dongeupmyen);
            holder.needpoint = convertView.findViewById(R.id.needpoint);
            holder.date = convertView.findViewById(R.id.date);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        CustomListItemsLw customListItemsLw = customListItemsLwArrayList.get(position);

        // 使用 Glide 加载图片
        Glide.with(context)
                .load(customListItemsLw.getDefaultImage()) // 假设 CustomListItemsLw.getDefaultImage() 返回的是图片 URL
                .into(holder.imageView);

        holder.title.setText(customListItemsLw.getTitle());
        holder.dongeupmyen.setText(customListItemsLw.getDongeupmyen());
        holder.needpoint.setText(customListItemsLw.getNeedpoint());
        holder.date.setText(customListItemsLw.getDate());

        return convertView;
    }

    // ViewHolder 模式,提高 ListView 的性能
    static class ViewHolder {
        ImageView imageView;
        TextView title;
        TextView dongeupmyen;
        TextView needpoint;
        TextView date;
    }

    public void addItem(String imageUrl, String title, String dongeupmyen, String needpoint, String date) {
        CustomListItemsLw item = new CustomListItemsLw();

        item.setDefaultImage(imageUrl); // 存储 imageUrl
        item.setTitle(title);
        item.setDongeupmyen(dongeupmyen);
        item.setNeedpoint(needpoint);
        item.setDate(date);

        customListItemsLwArrayList.add(item);
    }
}

关键的修改如下:

  1. 修改 addItem 方法: 将 addItem 方法的第一个参数类型从 Drawable 改为 String,用于接收图片 URL。
  2. 修改 CustomListItemsLw 类: 确保 CustomListItemsLw 类中的 defaultImage 字段类型为 String,用于存储图片 URL。
  3. 使用 Glide 加载图片: 在 getView() 方法中,使用 Glide.with(context).load(imageUrl).into(imageView) 来加载图片。

CustomListItemsLw 类示例:

package com.example.lazywarriorsapp;

public class CustomListItemsLw {
    private String defaultImage; // 修改为 String 类型,存储图片 URL
    private String title;
    private String dongeupmyen;
    private String needpoint;
    private String date;

    public String getDefaultImage() {
        return defaultImage;
    }

    public void setDefaultImage(String defaultImage) {
        this.defaultImage = defaultImage;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDongeupmyen() {
        return dongeupmyen;
    }

    public void setDongeupmyen(String dongeupmyen) {
        this.dongeupmyen = dongeupmyen;
    }

    public String getNeedpoint() {
        return needpoint;
    }

    public void setNeedpoint(String needpoint) {
        this.needpoint = needpoint;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

在 Activity 中使用:

// 在你的 Activity 中,获取到 imageUrl 后
String imageUrl = "your_image_url"; // 从 Firestore 获取的图片 URL
cadapter.addItem(imageUrl,
        snapshot.getData().get("title").toString()
                + "[" + snapshot.getData().get("joinperson").toString()
                + "/" + snapshot.getData().get("personalcount").toString() + "]",
        snapshot.getData().get("dongeupmyen").toString(),
        snapshot.getData().get("needpoint").toString() + "P",
        simpleDateFormat.format(startDate) + " ~ " + simpleDateFormat.format(endDate) + "    "
                + snapshot.getData().get("week").toString() + "per/week");

注意事项

  • 图片加载库: Glide 是一个强大的图片加载库,可以自动处理图片缓存、压缩等优化。你也可以选择其他图片加载库,如 Picasso。
  • ViewHolder 模式: 使用 ViewHolder 模式可以避免每次 getView() 方法都 findViewById,提高 ListView 的性能。
  • Context: 确保在 Glide 中使用正确的 Context。通常情况下,使用 parent.getContext() 或 Activity 的 Context 都可以。
  • 错误处理: 在实际应用中,应该添加错误处理机制,例如当图片加载失败时显示默认图片。
  • 异步加载: 图片加载是一个耗时操作,应该在后台线程中进行,避免阻塞 UI 线程。Glide 已经做了异步处理,所以通常不需要手动处理。
  • URL 安全: 确保从 Firestore 获取的 URL 是有效的,并且用户有权限访问。
  • 数据类型匹配: 确保传递给 addItem 方法的数据类型与方法签名匹配。

总结

本文详细介绍了如何从 Firestore 获取图片 URL 并在 BaseAdapter 中使用 Glide 加载图片。通过结合 Firebase SDK 和 Glide 库,你可以轻松地实现图片加载功能。记住要使用 ViewHolder 模式提高 ListView 的性能,并添加适当的错误处理机制。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

523

2023.08.02

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

546

2023.08.10

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

292

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1756

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2050

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

277

2023.10.18

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.2万人学习

Java 教程
Java 教程

共578课时 | 55.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号