использование функции Arraylist.add () в цикле - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу создать фрагмент уведомления в приложении Android, для этого у меня есть база данных firebase, подобная следующей

{
  "comments" : {
    "-M5TzP6GKDal61bEUY66" : {
      "-M5bP5nDhmEcHRij05SE" : {
        "comment" : "salaaaam",
        "username" : "snoussi khalil"
      }
    },
    "-M5co-nrZ8RxdFiuR_Vl" : {
      "-M5co92GjJDbs5mqTnp1" : {
        "comment" : "first",
        "username" : "omar kinani"
      },
      "-M5co9TwnSqcNzELI46x" : {
        "comment" : "first",
        "username" : "omar kinani"
      },
      "-M5coCPjicyKVeEC61B1" : {
        "comment" : "first",
        "username" : "omar kinani"
      },
      "-M5coE2WHdGrBGEi1QCn" : {
        "comment" : "first",
        "username" : "omar kinani"
      },
      "-M5coj-Z8jPekGDre3Ie" : {
        "comment" : "yea",
        "username" : "omar kinani"
      }
    }
  },
  "posts" : {
    "-M5TbWiSlgN7lW4_vJkm" : {
      "author" : "snoussi khalil",
      "lat" : 34.0401902,
      "longt" : -4.9937379,
      "txt" : "hello there guys"
    },
    "-M5TjFWG7abQnap0IOPH" : {
      "author" : "snoussi khalil",
      "lat" : 34.0401842,
      "longt" : -4.9937646,
      "txt" : "bonjor"
    },
    "-M5TzP6GKDal61bEUY66" : {
      "author" : "snoussi khalil",
      "lat" : 34.0401748,
      "longt" : -4.9937932,
      "txt" : "dude"
    },
    "-M5co-nrZ8RxdFiuR_Vl" : {
      "author" : "omar kinani",
      "txt" : "hey"
    }

, и получить комментарии к сообщениям, автор которых равен идентификатору пользователя, который я сделал. два за петли и попытался добавить Arraylist с комментариями к каждому сообщению. Моя проблема в том, что мой Arraylist пуст за пределами l oop, но содержит элементы внутри l oop, я знаю, потому что я использовал функцию LOG.d (), чтобы внимательно посмотреть, что происходит.

public class NotifFragment extends Fragment {

    private FirebaseDatabase database;
    private DatabaseReference postRef;
    private DatabaseReference comRef;
    private FirebaseAuth mAuth;

    private List<String> comments;


    @Nullable
    @Override
    public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
         View view = inflater.inflate(R.layout.fragment_notification,container,false);
         //database init
         database = FirebaseDatabase.getInstance();
         postRef = database.getReference("posts");
         comRef = database.getReference("comments");
         //user init
         mAuth = FirebaseAuth.getInstance();
         final String username = mAuth.getCurrentUser().getDisplayName();


         //init an empty arraylist for comments

        comments = new ArrayList<>();

         postRef.addValueEventListener(new ValueEventListener() {
             @Override
             public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                 for (final DataSnapshot keynode : dataSnapshot.getChildren()){
                    String author = keynode.child("author").getValue(String.class);
                    if (author.equals(username)){
                        comRef.child(keynode.getKey()).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
                                for (DataSnapshot item:dataSnapshot1.getChildren()){
                                    String comment = item.child("comment").getValue(String.class);
                                    Log.d("sos",""+comment+"and list size: "+comments.size());
                                    comments.add(comment);


                                }

                            }

                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {

                            }
                        });
                    }
                 }

             }

             @Override
             public void onCancelled(@NonNull DatabaseError databaseError) {

             }
         });

         Log.d("sos","your final list size is : "+comments.size());



        return  view;
    }
}

Я выполнил приложение и добавил фиктивные комментарии в пост. Три комментария "first", и четвертый: да, массив действительно увеличился внутри l oop, но достиг нулевого размера, когда, наконец, вышел за пределы l oop.

и LOGCAT:

12020-04-23 22:12:49.372 1664-1664/com.snoussi.univox D/sos: your final list size is : 0
2020-04-23 22:12:51.340 1664-1664/com.snoussi.univox D/sos: firstand list size: 0
2020-04-23 22:12:51.341 1664-1664/com.snoussi.univox D/sos: firstand list size: 1
2020-04-23 22:12:51.342 1664-1664/com.snoussi.univox D/sos: firstand list size: 2
2020-04-23 22:12:51.343 1664-1664/com.snoussi.univox D/sos: firstand list size: 3
2020-04-23 22:12:51.344 1664-1664/com.snoussi.univox D/sos: yeaand list size: 4

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Слушатель, существует задержка между моментом сбора данных и отображением списка. поэтому нет данных из-за задержки

, вы можете увидеть ее в своих журналах - сначала вы увидите это: com.snoussi.univox D / sos: ваш окончательный размер списка: 0 Хотя он записан после другого журналы

0 голосов
/ 24 апреля 2020

Вы получаете данные через некоторое время. Раздувать макет быстрее, чем извлекать данные из Firebase.

Так что да, в конце списка методов onCreateView() пусто, потому что вы получите их позже (в слушателе).

Когда вам нужно отобразить данные в каком-то списке, вы нужно сделать в onDataChange() методе:

public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    // Parse data
    // Show data in the list
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...