java - Android - GridView 中的按钮连续点击

标签 java android android-studio gridview

我在处理 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) onDataChange 方法。这会触发 addValueEventListener 再次被调用,因为这是这个被覆盖函数的确切行为。 addValueEventListener 将为 called each time the data is changed在您保留引用的那个确切节点上的 Firebase 数据库中。

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

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

关于java - Android - GridView 中的按钮连续点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50668379/

相关文章:

Android Studio 更新到 3.3.1 后,库的 AndroidX 转换失败,这是 Jetifier 的错误吗?

安卓工作室,CMake。如何在编译时打印调试信息?

java - 为什么要缓存 Java 对象?

java - SubscibeOn 对主题没有影响

java - 正则表达式匹配单个单词

android - “only position independent executables (PIE) are supported”

android - 错误 :Execution failed for task ':app:transformClassesWithPreJackRuntimeLibrariesForDebug'

android - 我在尝试运行 Android 虚拟设备时收到错误列表

java - 使用 Kaitai Struct 解析操作码

java - 在 Lucene 4 中,AtomicReader 和 CompositeReader 有什么区别