Java Android要求我声明一个final值,该值是我希望在函数onclicklistner中多次使用的值

Java Android要求我声明一个final值,该值是我希望在函数onclicklistner中多次使用的值,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,(已经检查了另一个问题,这个问题与firebase有关) 您好,所以我尝试在onClicklistner中重复使用ref,但是android studio要求我声明一个值为final,因此它只从firebase中检索一个项。。这是我的代码,将显示更多细节 DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("Bathrooms"); myRef.addVa

(已经检查了另一个问题,这个问题与firebase有关) 您好,所以我尝试在onClicklistner中重复使用ref,但是android studio要求我声明一个值为final,因此它只从firebase中检索一个项。。这是我的代码,将显示更多细节

 DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("Bathrooms");
        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull final DataSnapshot dataSnapshot) {



                for ( DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {


                    final Bathrooms bathrooms = dataSnapshot1.getValue(Bathrooms.class); // this is where I am asked and forced to create a final.

                    if( bathrooms.getAvailability().equals("Yes")) {


                        bathroomsArrayList.add(bathrooms);


                    }


                Browse.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        if(bathroomsArrayList!=null) {

                            if (bathrooms.getFloor().equals(Floor.getSelectedItem()) &&bathrooms.getSection().equals(Section.getSelectedItem())) {
                                    disable.setChecked(true);
                                    Toast.makeText(getActivity(), "Browse done successfully", Toast.LENGTH_SHORT).show();


                            }

                            else {
                                disable.setChecked(false);
                                Toast.makeText(getActivity(), "No bathrooms", Toast.LENGTH_SHORT).show();


                            }
                        }
                        else {
                            disable.setChecked(false);
                            Toast.makeText(getActivity(), "array empty", Toast.LENGTH_SHORT).show();


                        }

                    }
                });



                }

            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(getActivity(), "Opsss.... Something is wrong", Toast.LENGTH_SHORT).show();

            }
        });



return rootview;

    }
伙计。 我在这种情况下使用的第一种也是最简单的方法是在onCreate()之前定义变量, 然后你可以在你想要的任何地方使用它。 我觉得这对你有帮助…

伙计。 我在这种情况下使用的第一种也是最简单的方法是在onCreate()之前定义变量, 然后你可以在你想要的任何地方使用它。
我想这对你有帮助…

我无法想象为什么AndroidStudio会强迫你在这里期末考试。也许吧。 无论如何,因为变量是在for循环中定义的,所以每次迭代都会新创建它,所以它可以是最终的——也就是说,它在创建时直接初始化,并且从不分配新值


TL;DR:如果您的代码没有按预期工作,那么变量就不是final。

我无法想象为什么AndroidStudio会强迫您在这里使用final。也许吧。 无论如何,因为变量是在for循环中定义的,所以每次迭代都会新创建它,所以它可以是最终的——也就是说,它在创建时直接初始化,并且从不分配新值


TL;DR:如果您的代码未按预期运行,则变量不是最终变量。

谢谢您的回复,我看不出代码无法运行的任何其他原因,因为我希望数组包含所有值,同时它只带来一个值(最后添加到firebase中的值)您应该调试代码并查看dataSnapshot.getChildren()返回的子项数。并调试for循环以查看发生了什么。感谢您的回复,我看不出代码不起作用的任何其他原因,因为我希望数组包含所有值,同时它只带来一个值(最后添加到firebase中的值)。您应该调试代码并查看有多少子dataSnapshot.getChildren()返回。并调试for循环以查看发生了什么。感谢您的回复,我不能这样做,因为我需要数据库引用中的快照,所以它非常有用inside@OmarBinAli你到底想在这里做什么?Android ask for final如果你在点击监听器中使用var,并且var在创建之前没有声明,我认为ref可以是final,没有任何问题,因为你根本不能更改ref的值,final意味着一旦设置了它的值,你就不能为这个var设置另一个值,嗨,谢谢你的回复,我想检查整个firebase的某个值“availability=yes”,然后打开togglebutton,结果我只从firebase检索了一个值(最后添加的值),而不是所有值。感谢您的回复,我不能这样做,因为我需要数据库引用中的快照,所以最inside@OmarBinAli你到底想在这里做什么?Android ask for final如果你在点击监听器中使用var,并且var在创建之前没有声明,我认为ref可以是final,没有任何问题,因为你根本不能更改ref的值,final意味着一旦设置了它的值,你就不能为这个var设置另一个值,嗨,谢谢你的回复,我想检查整个firebase的某个值“availability=yes”,然后转动togglebutton,结果我只从firebase中检索一个值(最后添加的值),而不是所有值。作为
final
有什么问题?作为
final
有什么问题?