You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法访问其他类的方法?Firebase取问题显示至TextView遇困

解决Firebase获取问题&跨类方法访问的问题

我来帮你搞定这个从Firebase拉取问题、在TextView显示,还有没法访问其他类方法的麻烦~先看你的GameManager代码,核心问题主要在Firebase异步加载的特性和方法访问权限/数据传递逻辑上,咱们一步步来调整:

首先,明确你代码里可能存在的问题

你原来的GameManager构造函数里直接调用getQuestions(),但Firebase的数据库操作是异步的——也就是说,你调用getQuestions()后,代码会继续往下走,不会等Firebase把数据拉完再执行,这时候其他类去拿listquestions可能是空的。另外,如果你的方法是private修饰的,其他类自然没法访问。

重构GameManager:加入回调机制处理异步数据

咱们给GameManager加个回调接口,这样数据加载完成后能及时通知调用的界面类,同时把需要外部访问的方法改成public:

public class GameManager { 
    Context context; 
    private ArrayList<MyQuestion> listquestions = new ArrayList<>(); 
    private DatabaseReference mDatabase; 
    private OnQuestionsLoadedListener listener;

    // 定义回调接口,用来通知数据加载结果
    public interface OnQuestionsLoadedListener {
        void onQuestionsLoaded(ArrayList<MyQuestion> questions);
        void onLoadFailed(String error);
    }

    // 构造函数里传入回调监听
    public GameManager(Context context, OnQuestionsLoadedListener listener) { 
        this.context = context;
        this.listener = listener;
        getQuestions(); 
    }

    private void getQuestions() {
        mDatabase = FirebaseDatabase.getInstance().getReference("questions");
        mDatabase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                listquestions.clear(); // 避免重复加载数据
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    MyQuestion question = snapshot.getValue(MyQuestion.class);
                    if (question != null) {
                        listquestions.add(question);
                    }
                }
                // 数据加载完成,通过回调把结果传出去
                if (listener != null) {
                    listener.onQuestionsLoaded(listquestions);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                // 加载失败时通知调用者
                if (listener != null) {
                    listener.onLoadFailed(databaseError.getMessage());
                }
            }
        });
    }

    // 给外部类提供获取已加载问题列表的公开方法
    public ArrayList<MyQuestion> getListQuestions() {
        return listquestions;
    }

    // 如果你有其他需要外部调用的方法,一定要用public修饰,比如:
    public MyQuestion getNextQuestion(int currentIndex) {
        if (currentIndex < listquestions.size() - 1) {
            return listquestions.get(currentIndex + 1);
        }
        return null;
    }
}

在界面类(比如Activity)中调用并更新TextView

现在你可以在Activity/Fragment里实例化GameManager,通过回调拿到数据后更新你的TextView:

public class QuizActivity extends AppCompatActivity {
    private TextView questionTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);
        questionTextView = findViewById(R.id.question_text);

        // 实例化GameManager并设置回调监听
        new GameManager(this, new GameManager.OnQuestionsLoadedListener() {
            @Override
            public void onQuestionsLoaded(ArrayList<MyQuestion> questions) {
                // 数据加载成功,这里可以显示第一个问题(根据你的需求调整)
                if (!questions.isEmpty()) {
                    MyQuestion firstQuestion = questions.get(0);
                    // 假设MyQuestion类有getQuestionText()方法获取问题内容
                    questionTextView.setText(firstQuestion.getQuestionText());
                } else {
                    questionTextView.setText("暂无问题数据");
                }
            }

            @Override
            public void onLoadFailed(String error) {
                // 处理加载失败的情况,比如显示错误提示
                questionTextView.setText("加载问题失败:" + error);
            }
        });
    }
}

额外的排查点

  • 确保你的MyQuestion类字段和Firebase数据库里的字段名称完全一致,或者用@PropertyName注解做映射,不然Firebase解析数据会失败。
  • 检查Firebase数据库的安全规则,确保你的App有读取questions节点的权限,不然会加载失败。
  • 所有需要外部类访问的方法,必须用public修饰,不能是private或者默认的包访问权限。

内容的提问来源于stack exchange,提问作者ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:05:43