通过Android Recyceler View更新Firebase数据库中的值

时间:2018-08-22 05:39:50

标签: android firebase firebase-realtime-database android-recyclerview recycler-adapter

我正在开发一个显示从Firebase数据库中获取通知的应用程序。我在数据库中有一个字段,如日期,标题,文本!文本将是唯一的,因此我要使用从数据库中获取值的主键。

我有一个Recycler视图,用于更新值,但是当我尝试更新值时,有时它可以正常工作,但有时会修改数据库的所有值。有什么问题吗,我在回收者视图中。这是我的代码。

 @Override
public void onBindViewHolder(final NoticeAdminHolder holder, int position) {

    Notices n = list.get(position);
    holder.date.setText(n.getDate());
    holder.title.setText(n.getTitle());
    holder.text.setText(n.getText());

    text = holder.text.getText().toString();

    holder.update.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final Notices f = new Notices();

            f.setDate(holder.date.getText().toString());
            f.setTitle(holder.title.getText().toString());
            f.setText(holder.text.getText().toString());


            AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
            final View view = v;
            builder.setTitle("Confirm");
            builder.setMessage("Are you sure want to Update Record?");

            builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {

                   updateValue(text,f, view);
                   // Toast.makeText(view.getContext(), holder.title.getText()+" "+key, Toast.LENGTH_SHORT).show();
                    dialog.dismiss();
                }
            });

            builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {

                    // Do nothing
                    dialog.dismiss();
                }
            });

            AlertDialog alert = builder.create();
            alert.show();
        }
    });
}

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

public class NoticeAdminHolder extends RecyclerView.ViewHolder{

    EditText date, title, text;
    Button update, delete;
    public NoticeAdminHolder(View itemView) {
        super(itemView);
        date = itemView.findViewById(R.id.txtNoticeDate);
        title = itemView.findViewById(R.id.txtNoticeTitle);
        text = itemView.findViewById(R.id.txtNoticeDetails);
        update = itemView.findViewById(R.id.btnUpdate);
        delete = itemView.findViewById(R.id.btnDelete);
    }
}


public void updateValue(String text, Notices f, final View v){
    mDatabase = FirebaseDatabase.getInstance();
    myRef = mDatabase.getReference();
    final View view = v;
    final Notices notice = f;
    myRef.child("notices")
            .orderByChild("text")
            .equalTo(text)
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
                        key = childSnapshot.getKey();
                        myRef.child("notices").child(key).setValue(notice).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(v.getContext());
                                builder.setCancelable(true);
                                builder.setTitle("Success");
                                builder.setMessage("Data is Updated Successfully ! Please refresh the activity to reflect the changes.");
                                builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {

                                    public void onClick(DialogInterface dialog, int which) {
                                       // v.getContext().startActivity(new Intent(v.getContext(),NoticeAdminRecycler.class));
                                        ((Activity)v.getContext()).finish();
                                        dialog.dismiss();
                                    }
                                });
                                builder.show();
                                Toast.makeText(view.getContext(), "Data Saved", Toast.LENGTH_SHORT).show();


                            }
                        }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                Toast.makeText(view.getContext(), "Error Occured !!", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Toast.makeText(view.getContext(), "Database Error!!", Toast.LENGTH_SHORT).show();

                }
            });

          }

1 个答案:

答案 0 :(得分:0)

尝试在clickListener中设置文本值。

@Override
public void onBindViewHolder(final NoticeAdminHolder holder, int position) {

Notices n = list.get(position);
holder.date.setText(n.getDate());
holder.title.setText(n.getTitle());
holder.text.setText(n.getText());

//Do not set 'text' here, as it is the text of last binder holder, and not necessarily the one you clicked on

holder.update.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        final Notices f = new Notices();

        f.setDate(holder.date.getText().toString());
        f.setTitle(holder.title.getText().toString());
        f.setText(holder.text.getText().toString());

        //Setting the 'text' here ensures that the node you want to change is the node you clicked on.
        text = holder.text.getText().toString();

        AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
        final View view = v;
        builder.setTitle("Confirm");
        builder.setMessage("Are you sure want to Update Record?");

        builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface dialog, int which) {

               updateValue(text,f, view);
               // Toast.makeText(view.getContext(), holder.title.getText()+" "+key, Toast.LENGTH_SHORT).show();
                dialog.dismiss();
            }
        });

        builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {

                // Do nothing
                dialog.dismiss();
            }
        });

        AlertDialog alert = builder.create();
        alert.show();
    }
});

}