我正在开发一个显示从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();
}
});
}
答案 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();
}
});
}