【问题标题】:Delete from Firebase in an Adapter class从适配器类中的 Firebase 中删除
【发布时间】:2020-04-20 20:09:29
【问题描述】:

您好,我正在尝试从 Firebase 实时数据库中删除一个项目。我可以让它从 Recycler View 中删除,但它不会从 Firebase 中删除。

目前,我正在尝试通过单击 recyclerview 项目中的删除按钮来删除该项目,并将代码放入适配器 java 类中。

为了让它从 Firebase 中删除,我有什么遗漏吗?

我的适配器代码:

public class DailyMealAdapter extends RecyclerView.Adapter<DailyMealAdapter.MyViewHolder> {

    private Context context;
    private List<SelectedMeal> selectedMealList;

    private DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Meals");

    public DailyMealAdapter(Context c, List<SelectedMeal> sm) {
        context = c;
        selectedMealList = sm;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.dailymeal_item, parent, false);

        DailyMealAdapter.MyViewHolder viewHolder = new DailyMealAdapter.MyViewHolder(view);
        return viewHolder;

    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        final int itemPos = position;
        final SelectedMeal selectedMeal = selectedMealList.get(position);
        holder.mealTitle.setText(selectedMeal.getMealName());
        holder.mealCalories.setText(selectedMeal.getCalorieAmount());

        holder.mealDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
          selectedMealList.remove(position);
            notifyItemRemoved(position);
            notifyItemChanged(position, selectedMealList.size());
            final DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Meals");
            final ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    dataSnapshot.getValue(SelectedMeal.class);
                    ref.child(selectedMealList.get(position).getMealId()).removeValue();
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            };
            //ref.child(String.valueOf(selectedMealList.get(Integer.parseInt(selectedMeal.getMealId())))).removeValue();
            //deleteMeal(selectedMeal.getMealId(), itemPos);
        }
    });

    }

    @Override
    public int getItemCount() {
        return selectedMealList.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView mealTitle, mealCalories;
        public Button mealDelete;
        public CardView cardView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            mealTitle = (TextView) itemView.findViewById(R.id.dailyMealTitle);
            mealCalories = (TextView) itemView.findViewById(R.id.dailyMealCalories);
            cardView = (CardView) itemView.findViewById(R.id.dailyCardView);
            mealDelete = itemView.findViewById(R.id.deleteButton);
        }
    }

【问题讨论】:

  • 你能分享堆栈跟踪吗?有什么问题。
  • 错误是:java.lang.NullPointerException: Can't pass null for argument 'pathString' in child() at com.google.firebase.database.DatabaseReference.child(com.google.firebase :firebase-database@@19.2.1:96) at com.example.calorie2food.Adapters.DailyMealAdapter$1.onClick(DailyMealAdapter.j
  • 表示 selectedMeal.getMealId() 为空。
  • 什么原因会导致无效?我尝试了各种不同的方法来做到这一点,这是我每次遇到的相同错误
  • 你检查了 selectedMealList。 mealId 是空的吗??

标签: java firebase-realtime-database android-recyclerview removechild


【解决方案1】:

你可以试试这个:

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView mealTitle, mealCalories;
        public Button mealDelete;
        public CardView cardView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            mealTitle = (TextView) itemView.findViewById(R.id.dailyMealTitle);
            mealCalories = (TextView) itemView.findViewById(R.id.dailyMealCalories);
            cardView = (CardView) itemView.findViewById(R.id.dailyCardView);
            mealDelete = itemView.findViewById(R.id.deleteButton);
            mealDelete.setOnClickListener(this);

        }

        @Override
        public void onClick(View view) {
            ref.child(selectedMealList.get(getAdapterPosition()).getMealId()).removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                        selectedMealList.remove(getAdapterPosition());
                        notifyItemRemoved(getAdapterPosition());
                }
            });

        }
    }

onBindViewHolder 像一样干净

@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
    final int itemPos = position;
    final SelectedMeal selectedMeal = selectedMealList.get(position);
    holder.mealTitle.setText(selectedMeal.getMealName());
    holder.mealCalories.setText(selectedMeal.getCalorieAmount());
}

【讨论】:

  • 您好,我试过了,同样的错误仍然出现在空指针上
  • 所以 selectedMealList.get(getAdapterPosition()).getMealId()) 为空。你说不为空
  • 我更改了代码,并且 selectedMealList.get(position).getMealId() 工作。我在更新时将新代码添加到问题中
  • 你不需要 eventListener。
  • 你能分享你的firebase db吗?以及如何获取膳食清单。
猜你喜欢
  • 1970-01-01
  • 2017-09-06
  • 2021-03-03
  • 2020-02-07
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
相关资源
最近更新 更多