我在处理onClickListener
项目中的按钮的GridView
时遇到问题。我单击一次按钮。但是,一次执行onClick
函数后,会在一段时间内自动调用它。如何防止自动单击按钮?这是我的适配器代码:
@SuppressLint("ViewHolder")
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
assert inflater != null;
convertView = inflater.inflate(R.layout.single_product,parent,false);
Button buy = convertView.findViewById(R.id.btn_buy);
buy.setOnClickListener(new View.OnClickListener() {
double price = Double.parseDouble(products.get(position).getProductPrice());
@Override
public void onClick(View v) {
ringProgressDialog = ProgressDialog.show(context,
"Getting Information ...", "Please wait...", true);
assert user != null;
final String userId = user.getUid();
database.child(userId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
ringProgressDialog.dismiss();
if (dataSnapshot.exists()) {
userInfo = dataSnapshot.getValue(User.class);
assert userInfo != null;
double coin = Double.parseDouble(userInfo.getUserCoin());
if (coin<price){
Toast.makeText(context, "Not enough Coin.", Toast.LENGTH_LONG).show();
} else {
coin -= Double.parseDouble(products.get(position).getProductPrice());
userInfo.setUserCoin(String.valueOf(coin));
database.child(userId).setValue(userInfo).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
Operation.ShowAlertDialogue(context);
} else {
Toast.makeText(context, "There was an error. Please try again.", Toast.LENGTH_LONG).show();
}
}
});
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
ringProgressDialog.dismiss();
Toast.makeText(context, "Something not right.", Toast.LENGTH_SHORT).show();
}
});
}
});
return convertView;
}
OnClick
方法中的代码一直执行,直到coin
值变为0。如何防止它出现?提前致谢。
最佳答案
是的,这是在onClick
按钮上编码buy
执行的确切行为。您已经在Firebase数据库的特定用户ID节点上添加了addValueEventListener
,然后在database.child(userId).setValue(userInfo)
方法内再次设置了onDataChange
。这触发了addValueEventListener
再次被调用,因为这是此重写函数的确切行为。 addValueEventListener
将在您保持引用的确切节点上的Firebase数据库中为called each time the data is changed。
为了解决此问题,我建议您使用addListenerForSingleValueEvent()
代替addValueEventListener
,后者将被调用一次以从Firebase数据库中获取值。您可能还考虑查看documentation here。
我认为这可以解决您的问题。