Android - GridView中的按钮连续点击

时间:2018-06-03 16:10:06

标签: java android android-studio gridview

我在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.我如何防止它?

提前致谢。

1 个答案:

答案 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

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