Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Android Recyceler视图更新Firebase数据库中的值_Android_Firebase_Firebase Realtime Database_Android Recyclerview - Fatal编程技术网

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

通过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) {

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

                }
            });

          }
@覆盖
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