Firebase добавляет нового потомка, когда элемент на адаптере ненулевой - PullRequest
0 голосов
/ 31 января 2020

Здравствуйте, у меня есть функция в приложении, где вы будете добавлять данные из адаптера, если количество не равно нулю, и оно будет сохранено в базе данных реального времени 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);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 31 января 2020

Если вы хотите сгенерировать новый дочерний узел в местоположении, позвоните push() на этом DatabaseReference. Итак, чтобы создать новый дочерний узел в 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() вызов для каждого свойства. Это работает, но это означает, что любые слушатели будут вызываться три раза, по одному для каждого свойства.

Хотя это может быть тем, что вам нужно, довольно часто хочется, чтобы эти записи отображались как одна операция. Если это так, вы можете выполнить один setValue() с:

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

Конечный результат будет точно таким же, как и раньше, но теперь с одной операцией записи.

0 голосов
/ 31 января 2020

Вы должны использовать pu sh (), чтобы создать уникальный идентификатор для элемента базы данных

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