Запрашивать данные из Firestore в Arraylist, но ничего не получил? - PullRequest
0 голосов
/ 19 декабря 2018

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

Вот мой код

public class fmMain extends Fragment {
     private ArrayList<markerList> posList = new ArrayList<markerList>();
public fmMain() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {


    //Firebase get data
    stores.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
            for (QueryDocumentSnapshot documentSnapshot: queryDocumentSnapshots){
                markerList m = new markerList(documentSnapshot.getId());
                posList.add(m);
            }
            Log.d(TAG,posList.toString()); //got value
        }
    });
    Log.d(TAG,posList.toString()); //got nothing     
}

, как вы можете видеть, когда я пытался добавить значение в функцию onSuccess, я получил значение, которое было добавлено, нокогда я пытался добавить внешнюю функцию, я ничего не получил

А вот моя структура базы данных enter image description here

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы не можете просто использовать список posList вне метода onSuccess(), потому что он всегда будет empty из-за асинхронного поведения этого метода.Это означает, что к тому времени, когда вы пытаетесь напечатать posList.toString() вне этого метода, данные еще не закончили загрузку из базы данных, и поэтому они недоступны.Быстрое решение этой проблемы - использовать список только внутри метода onSuccess(), как показано в следующих строках кода:

stores.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<GeoPoint> list = new ArrayList<>();
            for (QueryDocumentSnapshot document : task.getResult()) {
                list.add(document.getGeoPoint("position"));
            }

            //Do what you need to do with your list
        }
    }
});

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

0 голосов
/ 19 декабря 2018

Вы получаете эту ошибку, потому что вы смешиваете асинхронные вызовы с синхронными.Метод onSuccess (асинхронный) будет вызван, когда вы успешно получите данные из Firebase.Но метод onCreateView не будет ждать этого.Он напрямую перейдет ко второму

Log.d(TAG,posList.toString()); //got nothing

, и вы ничего не получите (на самом деле я думаю, что вы получите пустую строку), потому что вы еще не получили данные.

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