【问题标题】:Android - Button in a GridView Clicking ContinuouslyAndroid - GridView 中的按钮连续单击
【发布时间】:2018-06-03 16:10:06
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: java android android-studio gridview


    【解决方案1】:

    是的,这正是您在buy 按钮上编写onClick 执行的方式。您已在 Firebase 数据库的特定用户 id 节点上添加了 addValueEventListener,然后在 onDataChange 方法中再次设置 database.child(userId).setValue(userInfo)。这会触发 addValueEventListener 再次被调用,因为这是此覆盖函数的确切行为。 addValueEventListener 将是您的 Firebase 数据库中的 called each time the data is changed,位于您保留引用的确切节点上。

    为了解决这个问题,我建议您使用addListenerForSingleValueEvent() 而不是addValueEventListener,后者将被调用一次以从您的 Firebase 数据库中获取值。您也可以考虑查看documentation here

    我认为这将解决您的问题。

    【讨论】:

    • 感谢@Reaz 它解决了这个问题。非常感谢您的帮助。
    • 很高兴知道我可以提供帮助。很高兴在 Stackoverflow 见到来自孟加拉国的开发人员。不客气。 :)
    猜你喜欢
    • 2012-10-24
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多