如何在onDataChange方法之外获取arrayList值,以便它不会激活startActivity

时间:2018-06-04 10:04:52

标签: android firebase exception firebase-realtime-database

我正在尝试从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

2 个答案:

答案 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) { }
  });
}