我在处理 GridView
项中的按钮的 onClickListener
时遇到问题。我点击按钮一次。但是,在执行一次 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。我该如何阻止它?
提前致谢。
最佳答案
是的,这正是您对 buy
按钮上的 onClick
执行进行编码的方式。您已在 Firebase 数据库的特定用户 ID 节点上添加了 addValueEventListener
,然后在 中再次设置了
方法。这会触发 database.child(userId).setValue(userInfo)
onDataChangeaddValueEventListener
再次被调用,因为这是这个被覆盖函数的确切行为。 addValueEventListener
将为 called each time the data is changed在您保留引用的那个确切节点上的 Firebase 数据库中。
为了解决这个问题,我建议您使用 addListenerForSingleValueEvent()
而不是 addValueEventListener
,它会被调用一次以从您的 Firebase 数据库中获取值。您可以考虑查看 documentation here以及。
我认为这会解决您的问题。
关于java - Android - GridView 中的按钮连续点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50668379/