我正在尝试从list.get(position).getPosition()
获取价值并将其传递给extras.putInt("STORY_POSITION", list.get(position).getPosition());
,但问题在我想要从方法public void onDataChange(@NonNull DataSnapshot dataSnapshot)
外部访问时开始。它引发了我的错误:IndexOutOfBoundsException: Index: 0, Size: 0
。所以基本上,我需要一个方法来访问onDataChange()
方法之外的列表值。
final List<User> list = new ArrayList<>();
holder.cont.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rootRef.child("users").child(mAuth.getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()){
user = ds.getValue(User.class);
list.add(user);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) { }
});
Intent intent = new Intent(getApplicationContext(), StoryActivity.class);
Bundle extras = new Bundle();
extras.putInt("PROJECT_ID", position);
extras.putInt("STORY_POSITION", list.get(position).getPosition());
extras.putInt("STORY_ID", model.getPosition_on_tree());
extras.putInt("CHAPTER_SIZE", model.getChapter_size());
intent.putExtras(extras);
startActivity(intent);
finish();
}
});
编辑:我需要在list.get(position).getPosition()
方法之外获取onDataChange
的原因是我有另一种方法调用onStop
我将新的位置值传递给数据库,并在MainActivity
启动时自动关闭并打开StoryActivity,因为数据库中的值已更改。当我手动覆盖DB中的值时,它也会发生在MainActivity中。这是我的MainActivity代码的link和StoryActivity的link。
答案 0 :(得分:1)
这是一个简单的技巧,您可以使用处理程序并在后可运行之前检查列表数据。
final List<User> list = new ArrayList<>();
holder.cont.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rootRef.child("users").child(mAuth.getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()){
user = ds.getValue(User.class);
list.add(user);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) { }
});
Handler handler = new Handler();
int delay = 1000; //milliseconds
handler.postDelayed(new Runnable(){
public void run(){
if(!list.isEmpty())//checking if the data is loaded or not
{
Intent intent = new Intent(getApplicationContext(), StoryActivity.class);
Bundle extras = new Bundle();
extras.putInt("PROJECT_ID", position);
extras.putInt("STORY_POSITION",
list.get(position).getPosition());
extras.putInt("STORY_ID", model.getPosition_on_tree());
extras.putInt("CHAPTER_SIZE", model.getChapter_size());
intent.putExtras(extras);
startActivity(intent);
finish();
}
else
handler.postDelayed(this, delay);
}
}, delay);
}
});
代码只会在从firebase获取数据时执行。
答案 1 :(得分:0)
onDataChange
是一个异步调用,将在其他某个时间点执行。由于您遇到问题,因此不会按顺序执行。
更新您的代码,如下所示:
public void onClick(View v) {
rootRef.child("users").child(mAuth.getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()){
user = ds.getValue(User.class);
list.add(user);
}
Intent intent = new Intent(getApplicationContext(), StoryActivity.class);
Bundle extras = new Bundle();
extras.putInt("PROJECT_ID", position);
extras.putInt("STORY_POSITION", list.get(position).getPosition());
extras.putInt("STORY_ID", model.getPosition_on_tree());
extras.putInt("CHAPTER_SIZE", model.getChapter_size());
intent.putExtras(extras);
startActivity(intent);
finish();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) { }
});
}