Java Android-GridView中的按钮持续单击

Java Android-GridView中的按钮持续单击,java,android,android-studio,gridview,Java,Android,Android Studio,Gridview,对于GridView项中的按钮,我有一个问题需要处理onClickListener。我按一下按钮。但是,在执行一次onClick函数后,会在一段时间内自动调用该函数。如何防止自动单击按钮?以下是我的适配器代码: @SuppressLint("ViewHolder") @Override public View getView(final int position, View convertView, ViewGroup parent) { LayoutInflater inflater

对于
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;
}
@suppressint(“视图持有者”)
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
断言充气器!=null;
convertView=充气机。充气(右布局。单产品,父产品,错误);
Button buy=convertView.findViewById(R.id.btn_buy);
buy.setOnClickListener(新视图.OnClickListener(){
double price=double.parseDouble(products.get(position.getProductPrice());
@凌驾
公共void onClick(视图v){
ringProgressDialog=ProgressDialog.show(上下文,
“正在获取信息…”,“请稍候…”,正确);
断言用户!=null;
最后一个字符串userId=user.getUid();
database.child(userId).addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
ringProgressDialog.Disclose();
if(dataSnapshot.exists()){
userInfo=dataSnapshot.getValue(User.class);
断言userInfo!=null;
double coin=double.parseDouble(userInfo.getUserCoin());

如果(coinYes,这就是您在
buy
按钮上执行
onClick
编码的确切行为。您已经在Firebase数据库的特定用户id节点上添加了
addValueEventListener
,然后您正在设置
database.child(userId).setValue(userInfo)
再次在
onDataChange
方法内。这将触发再次调用
addValueEventListener
,因为这是此被重写函数的确切行为。
addValueEventListener
将位于您保存引用的确切节点上的Firebase数据库中

为了解决这个问题,我建议你使用<代码> AddiistEngRealValueEngEnter()/代码>,而不是<代码> AdvaldEvEnviistListNo/Cuth>,这将被调用一次,用于从FialBasic数据库获取值。


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

谢谢@Reaz它解决了问题。非常感谢您的帮助。很高兴知道我能提供帮助。很高兴在Stackoverflow看到来自孟加拉国的开发人员。欢迎您。:)