通过Android Recyceler视图更新Firebase数据库中的值
我正在开发一个显示从firebase数据库获取的通知的应用程序。我在数据库中有一个字段,如日期、标题、文本!文本是唯一的,所以我使用的主键是从数据库中获取值 我有一个用于更新值的Recycler视图,但当我尝试更新值时,有时它工作正常,但有时会修改数据库的所有值。有什么不对的,我是在做回收商的看法。这是我的密码通过Android Recyceler视图更新Firebase数据库中的值,android,firebase,firebase-realtime-database,android-recyclerview,Android,Firebase,Firebase Realtime Database,Android Recyclerview,我正在开发一个显示从firebase数据库获取的通知的应用程序。我在数据库中有一个字段,如日期、标题、文本!文本是唯一的,所以我使用的主键是从数据库中获取值 我有一个用于更新值的Recycler视图,但当我尝试更新值时,有时它工作正常,但有时会修改数据库的所有值。有什么不对的,我是在做回收商的看法。这是我的密码 @Override public void onBindViewHolder(final NoticeAdminHolder holder, int position) {
@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();
}
});
}
@覆盖
BindViewHolder上的公共无效(最终通知MinHolder,int位置){
通知n=列表获取(位置);
holder.date.setText(n.getDate());
holder.title.setText(n.getTitle());
holder.text.setText(n.getText());
text=holder.text.getText().toString();
holder.update.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
最终通知f=新通知();
f、 setDate(holder.date.getText().toString());
f、 setTitle(holder.title.getText().toString());
f、 setText(holder.text.getText().toString());
AlertDialog.Builder=新建AlertDialog.Builder(v.getContext());
最终视图=v;
建造商名称(“确认”);
setMessage(“您确定要更新记录吗?”);
builder.setPositiveButton(“是”,新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
updateValue(文本、f、视图);
//Toast.makeText(view.getContext(),holder.title.getText()+“”+键,Toast.LENGTH_SHORT).show();
dialog.dismise();
}
});
setNegativeButton(“否”,新的DialogInterface.OnClickListener(){
@凌驾
public void onClick(DialogInterface dialog,int which){
//无所事事
dialog.dismise();
}
});
AlertDialog alert=builder.create();
alert.show();
}
});
}
@凌驾
public int getItemCount(){
返回list.size();
}
公共类NoticeAdminHolder扩展了RecyclerView.ViewHolder{
编辑文本日期、标题、文本;
按钮更新、删除;
公共通知最小持有者(查看项目视图){
超级(项目视图);
日期=itemView.findViewById(R.id.txtNotifiedate);
title=itemView.findViewById(R.id.txtNoticeTitle);
text=itemView.findViewById(R.id.txtNotifiedDetails);
update=itemView.findviewbyd(R.id.btnUpdate);
delete=itemView.findviewbyd(R.id.btnDelete);
}
}
public void updateValue(字符串文本、通知f、最终视图v){
mDatabase=FirebaseDatabase.getInstance();
myRef=mDatabase.getReference();
最终视图=v;
最终通知=f;
myRef.儿童(“通知”)
.orderByChild(“文本”)
.equalTo(文本)
.addListenerForSingleValueEvent(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot childSnapshot:DataSnapshot.getChildren()){
key=childSnapshot.getKey();
myRef.child(“通知”).child(键).setValue(通知).addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时公开作废(作废避免){
android.support.v7.app.AlertDialog.Builder=新的android.support.v7.app.AlertDialog.Builder(v.getContext());
builder.setCancelable(true);
建造商名称(“成功”);
setMessage(“数据更新成功!请刷新活动以反映更改。”);
setPositiveButton(“确定”,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
//v.getContext().startActivity(新意图(v.getContext(),NoticeAdminRecycler.class));
((活动)v.getContext()).finish();
dialog.dismise();
}
});
builder.show();
Toast.makeText(view.getContext(),“数据已保存”,Toast.LENGTH_SHORT.show();
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Toast.makeText(view.getContext(),“出错!!”,Toast.LENGTH\u SHORT.show();
}
});
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
Toast.makeText(view.getContext(),“数据库错误!!”,Toast.LENGTH\u SHORT.show();
}
});
}
尝试在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();
}
});
}修改数据库的所有值是什么意思?值更改为什么?意味着我在firebase中有一个节点通知,在该通知下,子节点是用字段date、title和text创建的。当我运行应用程序并更新节点通知的特定子节点的值时,它工作正常。但有时它的行为不规则,并修改了多个节点的子节点通知。谢谢!这就是问题所在。。但是我不能将文本值放在click listener中,因为我认为它是更新数据库的键值,但是如果有人更改了文本本身的值,我将无法更新t