我在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.我如何防止它?
提前致谢。
答案 0 :(得分:1)
是的,这是您在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。
我认为这可以解决您的问题。