Android - кнопка в GridView, непрерывно щелкающая - PullRequest
0 голосов
/ 03 июня 2018

У меня проблема с 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 голосов
/ 03 июня 2018

Да, это именно то, как вы кодировали выполнение onClick на своей кнопке buy.Вы добавили addValueEventListener в определенный узел идентификатора пользователя вашей базы данных Firebase, а затем снова устанавливаете database.child(userId).setValue(userInfo) в методе onDataChange.Это вызывает повторный вызов addValueEventListener, поскольку это точное поведение переопределенной функции.addValueEventListener будет вызываться при каждом изменении данных в вашей базе данных Firebase на том конкретном узле, на который вы ссылаетесь.

Чтобы преодолеть эту проблему, я бы предложил вам использовать addListenerForSingleValueEvent() вместо addValueEventListener, который будет вызываться один раз для получения значений из вашей базы данных Firebase.Вы также можете посмотреть документацию здесь .

Думаю, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...