当前位置:

首页 > 编程开发 > Firestore 获取图片URL并显示在Adapter中

Firestore 获取图片URL并显示在Adapter中

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

从 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 加载图片:

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 的性能,并添加适当的错误处理机制。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
github配置ssh key windows
github配置ssh key windows

本文详解如何在Windows环境中使用PowerShell生成SSH密钥对,配置ssh-agent自动加载私钥,并将公钥安全添加至GitHub账户,最后通过git remote set-url切换为SSH地址,解决每次操作需输入账号密码的问题。

backdrop和background区别
backdrop和background区别

深入解析backdrop与background在网页开发及视觉设计中的区别。通过CSS代码示例,展示如何正确使用background设置元素背景,以及利用backdrop-filter创建弹窗遮罩模糊效果,避免概念混用。

windsurf ide download Windows版安装教程
windsurf ide download Windows版安装教程

详解 Windsurf IDE 在 Windows 系统的下载来源、安装步骤及首次启动界面。指导用户如何导入编辑器设置、打开项目文件夹及使用终端与 AI 功能,适合初次接触该工具的开发者阅读。

ServBay安装配置详细教程与操作指南
ServBay安装配置详细教程与操作指南

新手入门 ServBay 本地开发环境,详解安装包下载、Dashboard 状态监控、Packages 组件安装、Services 服务控制及 Websites 项目配置。掌握 .servbay.config 版本管理与日志排查技巧,快速搭建稳定的 PHP、Node.js 等多语言开发环境。

codekit环境配置指南从安装到环境搭建完整教程
codekit环境配置指南从安装到环境搭建完整教程

详解 CodeKit 在 macOS 下的安装步骤、项目导入方法、Sass与JavaScript编译设置及浏览器自动刷新功能,助您快速搭建高效的前端开发环境。

codex安装windows 命令行完整操作教程
codex安装windows 命令行完整操作教程

详解Windows环境下安装OpenAI Codex CLI的步骤,包括WSL环境检查、Node.js/npm配置、npm全局安装命令及首次启动验证,适合开发者快速上手。

NativeRest环境配置要求与完整操作教程
NativeRest环境配置要求与完整操作教程

学习如何配置 NativeRest REST API 客户端。涵盖 Windows/macOS/Linux 安装后的工作区创建、环境变量管理、请求编辑及响应查看步骤,帮助开发者快速完成基础环境搭建与连通性测试。

CSS设置透明度的注意事项有哪些?opacity属性详解
CSS设置透明度的注意事项有哪些?opacity属性详解

深入解析CSS中设置透明度的核心属性opacity,剖析子元素继承、事件穿透、层叠上下文等关键注意事项,并提供与rgba、hsla的实用选型对比。

flutter页面传值到后台的方法及示例代码
flutter页面传值到后台的方法及示例代码

flutter页面传值到后台的完整实现方法及示例代码,帮助读者快速掌握相关技术要点。

Java 8至21新特性代码写法对比:Lambda、Record与Switch
Java 8至21新特性代码写法对比:Lambda、Record与Switch

本文通过具体的旧版与新版代码对比,详细剖析Java 8引入的Lambda表达式、Java 14/16引入的Record类,以及Java 12至21逐步演进完善的Switch表达式与模式匹配,展示代码简化路径与避坑要点。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Shapr3D macOS版
Shapr3D macOS版
Mac

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

REAPER macOS版
REAPER macOS版
Mac

REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

Ableton Live macOS版
Ableton Live macOS版
Mac

Ableton Live 是面向音乐制作人与现场表演者的数字音频工作站,提供编曲视图、独具特色的现场视图、音频录制、MIDI创作、实时变速、乐器及效果器。Mac版原生支持Apple芯片,并可连接音频接口、MIDI控制器和第三方插件。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。