You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android跨Fragment删除Firestore数据触发空指针异常问题

问题描述

开发Android应用时,在Home Fragment的RecyclerView列表项中设置了心形心愿单复选框。用户点击可将商品加入Wishlist Fragment,再次点击需从Wishlist中删除。添加功能正常,但删除操作触发空指针异常。


核心代码

holder.wishlist.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

        Boolean isCheck = compoundButton.isChecked();

        // 从Home Fragment添加商品到心愿单
        if(isCheck)
        {
            firebaseFirestore.collection("wishlistDetails").document(uid).set(wishMap).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful())
                    {
                        holder.wishlist.setButtonDrawable(R.drawable.ic_favorite_filled);
                        Toast.makeText(context, "item added to wishlist" + pos , Toast.LENGTH_SHORT).show();
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {}
            });

        // 从Home Fragment删除心愿单商品  
        }else {
            firebaseFirestore.collection("wishlistDetails").document(wishlist_models.get(position).getUid())
                    .delete()
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            Toast.makeText(context, "item removed from wishlist", Toast.LENGTH_SHORT).show();
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
});

Wishlist_Model类代码

public class Wishlist_Model {
    private List<String> images;
    private String name;
    private String email;
    private String delete;
    private String uid;

    public Wishlist_Model()  {}

    public Wishlist_Model(List<String> images, String name, String email, String delete, String uid) {
        this.images = images;
        this.name = name;
        this.email = email;
        this.delete = delete;
        this.uid = uid;
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
    public String getDelete() { return delete; }
    public void setDelete(String delete) { this.delete = delete; }
    public List<String> getImages() { return images; }
    public void setImages(List<String> images) { this.images = images; }
    public String getUid() { return uid; }
    public void setUid(String uid) { this.uid = uid; }
}

Firestore集合结构

wishlistDetails集合以用户UID为文档ID,文档包含以下字段:

  • delete:字符串类型
  • email:字符串类型
  • images:字符串列表类型
  • name:字符串类型

错误信息

java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference

问题分析与解决

空指针异常根源是wishlist_models列表未初始化(为null),调用wishlist_models.get(position)时触发错误。

修复方案

  1. 初始化列表:确保在RecyclerView适配器初始化前,wishlist_models已被实例化,例如:

    private List<Wishlist_Model> wishlist_models = new ArrayList<>();
    
  2. 复用添加时的UID:删除操作无需从wishlist_models取UID,直接复用添加时使用的用户uid(与Firestore文档ID一致),修改删除逻辑:

    }else {
        firebaseFirestore.collection("wishlistDetails").document(uid)
                .delete()
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if(task.isSuccessful()){
                            holder.wishlist.setButtonDrawable(R.drawable.ic_favorite_border); // 恢复空心图标
                            Toast.makeText(context, "item removed from wishlist", Toast.LENGTH_SHORT).show();
                        }
                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
                holder.wishlist.setChecked(true); // 失败时恢复选中状态
            }
        });
    }
    
  3. 同步UI状态:删除成功后切换回空心心形图标;删除失败时将复选框重新设为选中,避免UI与实际数据状态不一致。

内容的提问来源于stack exchange,提问作者user20008723

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:25:39