Android / Firebase - Как добавить полученные данные в ArrayList - PullRequest
0 голосов
/ 30 сентября 2018

У меня возникают некоторые проблемы при попытке сделать это, потому что данные загружаются асинхронно.

У меня есть recyclerView, и мне нужно поместить данные в список, чтобы их можно было перерабатывать, отображая информацию наэкран, но, оказывается, это довольно сложно сделать.

Вот что я получил до сих пор:

refQuestions.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Question question = dataSnapshot.getValue(Question.class);
                arrayList.add(question.title);
                Log.d("MyApp", question.title);
            }

Я хочу, чтобы код как бы "останавливался" здесь и только продолжалвыполняется после полной загрузки данных в мой массив, как какой-то обратный вызов.

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018
private void getQuestions() {
    DatabaseReference refQuestions = /* initialise the reference here */;
    refQuestions.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                /* keep iterating through all the children, this way you can
                   keep track of the retrieval progress */
                for (DataSnapshot question : dataSnapshot.getChildren()) {
                    arrayList.add(question.getValue(Question.class).title);
                }
                /* this is where you write the code what to do after getting
                   all data or call another function to do the job*/
            }
        }

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

        }
    });
}

Вы также можете заменить это ..

refQuestions.addListenerForSingleValueEvent(new ValueEventListener() {

на

refQuestions.addValueEventListener(new ValueEventListener() {

для обновления в реальном времени

0 голосов
/ 30 сентября 2018

Вы можете использовать addChildEventListener или addListenerForSingleValueEvent, как в моем коде ниже:

ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<String> arrayList = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Question question = ds.getValue(Question.class);
            arrayList.add(question.title);
        }

        //Do what you need to do with your arrayList
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
refQuestions.addListenerForSingleValueEvent(valueEventListener);

Как видите, быстрое решение этой проблемы - использование arrayListтолько внутри метода onDataChange().Если вы хотите использовать его снаружи, я рекомендую вам посмотреть последнюю часть моего ответа от этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

0 голосов
/ 30 сентября 2018

Вы можете использовать метод onDataChange, чтобы добавить полученный результат в список массивов

ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
        Question question = ds.getValue(Question.class);
        arrayList.add(question.title);
    }
}
});

И затем вы можете легко отобразить их в представлении рециркулятора.Для получения дополнительной информации нажмите здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...