Java 如何访问从封闭类检索到匿名内部类(侦听器)中的数据?

Java 如何访问从封闭类检索到匿名内部类(侦听器)中的数据?,java,arraylist,anonymous-class,Java,Arraylist,Anonymous Class,我已从Firestore检索到字符串列表。我想用这些数据填充微调器。我知道一个内部类只能从封闭类中访问一个变量,如果该变量被声明为final。但是出于某种原因,IDE告诉我它不能是列表,而必须是单个元素的数组 因为我想做的事情一定很平常,我怀疑我比平常更笨,错过了显而易见的东西……但我就是看不见 我已经阅读了Oracle的Java文档中关于嵌套类、内部类和匿名类的内容,但毫无用处 private void setUpSpinners(DocumentReference DBStructureDo

我已从Firestore检索到字符串列表。我想用这些数据填充微调器。我知道一个内部类只能从封闭类中访问一个变量,如果该变量被声明为final。但是出于某种原因,IDE告诉我它不能是列表,而必须是单个元素的数组

因为我想做的事情一定很平常,我怀疑我比平常更笨,错过了显而易见的东西……但我就是看不见

我已经阅读了Oracle的Java文档中关于嵌套类、内部类和匿名类的内容,但毫无用处

private void setUpSpinners(DocumentReference DBStructureDocRef){

    List<String> allUnitTypes = new ArrayList<>();

    DBStructureDocRef.get()
            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                @Override
                public void onSuccess(DocumentSnapshot documentSnapshot) {
                    if (documentSnapshot.exists()) {

                        allUnitTypes = (List<String>) documentSnapshot.get(KEY_ALL_UNIT_TYPES);

                    } else {
                        Toast.makeText(MainActivity.this, "Document does not exist", Toast.LENGTH_SHORT).show();
                    }
                }
            });
    // then go on to do something with the data retrieved in allUnitTypes
private void设置微调器(DocumentReference DBStructureDocRef){
List allUnitTypes=new ArrayList();
DBStructureDocRef.get()
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(文档快照文档快照){
if(documentSnapshot.exists()){
allUnitTypes=(列表)documentSnapshot.get(键为所有单元类型);
}否则{
Toast.makeText(MainActivity.this,“文档不存在”,Toast.LENGTH_SHORT.show();
}
}
});
//然后继续处理在allUnitTypes中检索到的数据
当allUnitTypes没有声明为final时,我得到一条消息:变量'allUnitTypes'是从内部类中访问的,需要声明为final


当我将allUnitTypes声明为final时,我得到一条消息:无法为final变量'allUnitTypes'赋值。

那么,您是从另一个类调用此方法吗?(如果是,将该方法设置为非私有)将变量设为final-然后填充列表,而不是重新赋值:
allUnitTypes.addAll(…)
。使用适配器并将其链接到您的微调器而不是使用列表可能是有意义的。我正在从专用方法setUpSpinners中调用OnSuccessListener。建议“填充列表而不是重新分配列表”非常有效。谢谢。(因此我没有“比平时更愚蠢”)但不幸的是,仍然非常无知。是的,微调器将有一个适配器来设置内容:final ArrayAdapter adapter=new ArrayAdapter(这个,android.R.layout.simple_spinner_item,allUnitTypes){那么,你是从另一个类调用这个方法吗?(如果是,让这个方法非私有)将变量设为final-然后填充列表而不是重新分配它:
allUnitTypes.addAll(…)
。使用适配器并将其链接到微调器而不是列表可能是有意义的。我正在从专用方法setUpSpinners中调用OnSuccessListener。建议“填充列表而不是重新分配列表”就像一个符咒。谢谢。(所以我不是“比平时更笨”,但不幸的是仍然非常无知。是的,微调器将有一个适配器来设置内容:final ArrayAdapter adapter=new arrarayadapter(这个,android.R.layout.simple\u spinner\u项,allUnitTypes){