我正在尝试在按钮单击的子项中创建一个随机键,并在该键中插入数据
但当我点击这个按钮时,它会创建多个具有相同数据的键,并且一直持续到我在后台关闭应用程序为止
上面的问题是在postreview()
方法中,在我的代码中,我在按钮clcik上调用这个方法
public class DisplayStory extends AppCompatActivity {
TextView Tittle;
WebView webView;
String story;
String storyname;
String catagory;
String TAG = "display";
DatabaseReference storyref;
DatabaseReference ratingref;
RatingObject ratingObject;
// review stuff
RatingBar user_ratingBar;
EditText comment_EditText;
EditText senderName_editText;
Button submit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_story);
Tittle = findViewById(R.id.TITLE);
webView = findViewById(R.id.webview);
// review stuff
user_ratingBar = findViewById(R.id.ratings_to_submit);
comment_EditText = findViewById(R.id.comment_to_submit);
senderName_editText = findViewById(R.id.sender_name);
submit = findViewById(R.id.submit_btn);
storyname = getIntent().getStringExtra("tittle");
catagory = getIntent().getStringExtra("catagory");
Log.d(TAG,"storyname "+storyname);
Log.d(TAG,"storyname "+catagory);
Tittle.setText(storyname);
storyref = FirebaseDatabase.getInstance().getReference(catagory).child(storyname);
ratingref = FirebaseDatabase.getInstance().getReference(catagory).child(storyname).child("rating");
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PostReview();
}
});
storyref.child("story").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
story = dataSnapshot.getValue().toString();
webView.loadData(story,"text/html", "UTF-8");
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setDisplayZoomControls(false);
Log.d(TAG,"story exist ");
Log.d(TAG,"story "+story);
}
else {
Log.d(TAG,"no story exist ");
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
public void PostReview(){
final String name,comment;
final float rating;
name = senderName_editText.getText().toString();
comment = comment_EditText.getText().toString();
rating = user_ratingBar.getRating();
ratingref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
ratingObject =
new RatingObject(name,comment,rating);
ratingref.push().setValue(ratingObject);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
就我所见,不需要在PostReView
方法中附加侦听器,因为您不使用DataSnapShot
中的任何数据。
所以在这种情况下,代码可以简单得多:
public void PostReview(){
final String name,comment;
final float rating;
name = senderName_editText.getText().toString();
comment = comment_EditText.getText().toString();
rating = user_ratingBar.getRating();
ratingObject = new RatingObject(name,comment,rating);
ratingref.push().setValue(ratingObject);
}
这还将解决无止境循环,该循环是由于调用添加了AddValueEventListener
的侦听器的OnDataChange
内部的SetValue
而导致的。 有关更详细的解释,请参见: