我在处理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

我认为这可以解决您的问题。

08-05 03:41
查看更多