繁体   English   中英

当适配器上的项目非零时,Firebase 添加新子项

[英]Firebase add new child when an item on adapter is non-zero

您好,我在应用程序中有一个函数,如果数量不为零,您将从适配器添加数据,并将其保存到 firebase 实时数据库。 我想要做的是,如果适配器中的另一个项目非零,它将向数据库添加一个子项,但 Firebase 只是替换该项目而不是添加一个新子项,我该怎么办?

这是代码

public class UsualFragRViewAdapter extends RecyclerView.Adapter <UsualFragRViewAdapter.ViewHolder>  {

    private List<FragmentsUsualModels> items;
    private Context context;

    public UsualFragRViewAdapter( Context context,List<FragmentsUsualModels> items ) {
        this.context = context;
        this.items = items;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_usual_array, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
        final FragmentsUsualModels arrayitems = items.get(position);
        holder.itemName.setText(arrayitems.getItemName());
        holder.price.setText(String.valueOf("$ " +arrayitems.getPrice()));
        holder.quantity.setNumber(arrayitems.getQuantity());

        holder.card.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            }
        });

        holder.quantity.setOnValueChangeListener(new ElegantNumberButton.OnValueChangeListener() { //all items are located in its positions
            @Override
            public void onValueChange(ElegantNumberButton view, int oldValue, int newValue) { //Need to pass all non-zero items as chatview
                arrayitems.setQuantity(String.valueOf(newValue));

                if (newValue !=0){
                    String datavalue = holder.itemName.getText().toString();
                    String dataprice = holder.price.getText().toString();
                    String dataquantity = holder.quantity.getNumber().toString();

                    DatabaseReference data = FirebaseDatabase.getInstance().getReference("itemdata");
                    data.child("dataname").setValue(datavalue);
                    data.child("dataprice").setValue(dataprice);
                    data.child("dataquantity").setValue(dataquantity);

                    Log.d(TAG, "the new value of this data is: " +dataquantity);
                    Log.d(TAG, "the itemname of this position is:  "+datavalue);
                    Log.d(TAG, "the price of this item in this position is: " +dataprice);
                }

                Log.d(TAG, "user changed the quantity in this position to " +arrayitems);
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        CardView card;
        ImageView image;
        TextView itemName;
        TextView price;
        ElegantNumberButton quantity;
        Button donebtn;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            card = itemView.findViewById(R.id.ucard);
            image = itemView.findViewById(R.id.uimage);
            itemName = itemView.findViewById(R.id.uitemName);
            price = itemView.findViewById(R.id.uprice);
            quantity = itemView.findViewById(R.id.uquantity);
            donebtn = itemView.findViewById(R.id.udonebtn);
        }
    }
}

如果要在某个位置下生成新的子节点,请对该DatabaseReference调用push() 所以要在itemdata下创建一个新的子节点:

DatabaseReference data = FirebaseDatabase.getInstance().getReference("itemdata");
DatabaseReference newData = data.push();

现在您可以将数据写入这个新位置:

newData.child("dataname").setValue(datavalue);
newData.child("dataprice").setValue(dataprice);
newData.child("dataquantity").setValue(dataquantity);

需要考虑的另一个变化是减少写入次数。 您当前的代码对每个属性执行单独的setValue()调用。 这有效,但这意味着任何侦听器都将被调用 3 次,每个属性调用一次。

虽然这可能是您想要的,但希望这些写入显示为一个操作是很常见的。 如果是这种情况,您可以使用以下命令执行单个setValue()

Map<String,Object> values = new HashMap<>();
values.put("dataname", datavalue);
values.put("dataprice", dataprice);
values.put("dataquantity", dataquantity);
newData.setValue(values);

最终结果将与以前完全相同,但现在只需一次写入操作。

您应该使用 push() 为数据库项创建唯一 ID

dataBase.child(/*CHILD*/).push().setValue(dataValue);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM