java.lang.IndexOutOfBoundsException: 索引:0,大小:从 firebase 服务器获取数据时为 0
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 when getting data from firebase server
我在创建可以与 firebase 交互并获取存储在服务器中的信息的应用程序时遇到问题。但是我在 第 53 行 处遇到了一些问题。请提供信息,因为我不知道为什么会这样。当我尝试使用离线直接“问题”时,它工作得很好。但是连接服务器的时候,每次都失败
//Line 53
questions = list.get(index);
这就是我在 QuestionAnsActivity.java
中所做的
...
import static com.company.appname.QuizSplash.list;
...
public class QuestionAnsActivity extends AppCompatActivity {
...
List<Questions> allQuestionsList;
Questions questions;
int index = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.question_ans_activity);
...
allQuestionsList = list;
Collections.shuffle(allQuestionsList);
// The below code is my line 53
questions = list.get(index);
}}
这就是我在 QuizSplash.java
中所做的
public class QuizSplash extends AppCompatActivity {
public static ArrayList<Questions> list;
DatabaseReference databaseReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz_splash);
list = new ArrayList<>();
databaseReference = FirebaseDatabase.getInstance().getReference("Question");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
Questions questions = dataSnapshot.getValue(Questions.class);
list.add(questions);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
Intent intent = new Intent(QuizSplash.this, QuestionAnsActivity.class);
startActivity(intent);
}
}
这是在Questions.java
public class Questions {
String question;
String option1;
String option2;
String option3;
String option4;
String answer;
//==================================================================================================
// Empty constructor
//==================================================================================================
public Questions() {
}
//==================================================================================================
// Constructor
//==================================================================================================
public Questions(String question, String option1, String option2,
String option3, String option4, String answer) {
this.question = question;
this.option1 = option1;
this.option2 = option2;
this.option3 = option3;
this.option4 = option4;
this.answer = answer;
}
//==================================================================================================
// Getter and setter methods start here
//==================================================================================================
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getOption1() {
return option1;
}
public void setOption1(String option1) {
this.option1 = option1;
}
public String getOption2() {
return option2;
}
public void setOption2(String option2) {
this.option2 = option2;
}
public String getOption3() {
return option3;
}
public void setOption3(String option3) {
this.option3 = option3;
}
public String getOption4() {
return option4;
}
public void setOption4(String option4) {
this.option4 = option4;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
}
据我所知,您有两个 class。 QuizSplash class 是您实际执行数据库调用以获取问题的地方,QuestionAnsActivity class 是您将来自数据库的结果分配给名为 allQuestionsList
的现有列表的地方。但这不是您处理实时数据库的方式。
不要忘记数据是从实时数据库异步加载的,这意味着任何需要从数据库获取数据的代码都需要在 onDataChange()
方法中,或者从那里调用。所以你不能设置 list
对象 public 和静态并简单地在另一个 activity 中使用它。您需要等待数据完成加载。因此,您可以在回调中使用该列表,也可以使用我在以下 post:
中的回答
我在其中解释了如何使用接口传播结果。如果您了解 Kotlin,您可能还会有兴趣阅读以下文章:
我在创建可以与 firebase 交互并获取存储在服务器中的信息的应用程序时遇到问题。但是我在 第 53 行 处遇到了一些问题。请提供信息,因为我不知道为什么会这样。当我尝试使用离线直接“问题”时,它工作得很好。但是连接服务器的时候,每次都失败
//Line 53
questions = list.get(index);
这就是我在 QuestionAnsActivity.java
中所做的...
import static com.company.appname.QuizSplash.list;
...
public class QuestionAnsActivity extends AppCompatActivity {
...
List<Questions> allQuestionsList;
Questions questions;
int index = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.question_ans_activity);
...
allQuestionsList = list;
Collections.shuffle(allQuestionsList);
// The below code is my line 53
questions = list.get(index);
}}
这就是我在 QuizSplash.java
中所做的public class QuizSplash extends AppCompatActivity {
public static ArrayList<Questions> list;
DatabaseReference databaseReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quiz_splash);
list = new ArrayList<>();
databaseReference = FirebaseDatabase.getInstance().getReference("Question");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
Questions questions = dataSnapshot.getValue(Questions.class);
list.add(questions);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
Intent intent = new Intent(QuizSplash.this, QuestionAnsActivity.class);
startActivity(intent);
}
}
这是在Questions.java
public class Questions {
String question;
String option1;
String option2;
String option3;
String option4;
String answer;
//==================================================================================================
// Empty constructor
//==================================================================================================
public Questions() {
}
//==================================================================================================
// Constructor
//==================================================================================================
public Questions(String question, String option1, String option2,
String option3, String option4, String answer) {
this.question = question;
this.option1 = option1;
this.option2 = option2;
this.option3 = option3;
this.option4 = option4;
this.answer = answer;
}
//==================================================================================================
// Getter and setter methods start here
//==================================================================================================
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getOption1() {
return option1;
}
public void setOption1(String option1) {
this.option1 = option1;
}
public String getOption2() {
return option2;
}
public void setOption2(String option2) {
this.option2 = option2;
}
public String getOption3() {
return option3;
}
public void setOption3(String option3) {
this.option3 = option3;
}
public String getOption4() {
return option4;
}
public void setOption4(String option4) {
this.option4 = option4;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
}
据我所知,您有两个 class。 QuizSplash class 是您实际执行数据库调用以获取问题的地方,QuestionAnsActivity class 是您将来自数据库的结果分配给名为 allQuestionsList
的现有列表的地方。但这不是您处理实时数据库的方式。
不要忘记数据是从实时数据库异步加载的,这意味着任何需要从数据库获取数据的代码都需要在 onDataChange()
方法中,或者从那里调用。所以你不能设置 list
对象 public 和静态并简单地在另一个 activity 中使用它。您需要等待数据完成加载。因此,您可以在回调中使用该列表,也可以使用我在以下 post:
我在其中解释了如何使用接口传播结果。如果您了解 Kotlin,您可能还会有兴趣阅读以下文章: