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)时触发错误。
修复方案
初始化列表:确保在RecyclerView适配器初始化前,
wishlist_models已被实例化,例如:private List<Wishlist_Model> wishlist_models = new ArrayList<>();复用添加时的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); // 失败时恢复选中状态 } }); }同步UI状态:删除成功后切换回空心心形图标;删除失败时将复选框重新设为选中,避免UI与实际数据状态不一致。
内容的提问来源于stack exchange,提问作者user20008723
相关产品推荐
相关产品推荐

