Как я могу получить значение массива, который обновляется внутри addValueEventListener? - PullRequest
0 голосов
/ 27 июня 2018

Я хочу показать listview из ArrayList, который я получаю по запросу. ArrayList pt in addValueEventListener становится null вне addValueEventListener, хотя ArrayList объявляется как статическое свойство. Есть ли способ получить значения ArrayList вне этого eventlistener?

query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot!=null) {
            Log.e("TAG", String.valueOf(dataSnapshot.child("uid").child("Name")));
            int i=0;
            for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                String userName = snapshot.child("Name").getValue(String.class);
                Pt.add(userName);
                //Toast.makeText(getApplicationContext(),  dataSnapshot.toString(), Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(getApplicationContext(), "Datasnapshot is null", Toast.LENGTH_SHORT).show();
         }
    }

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Ваш список Pt всегда будет empty вне onDataChange() из-за асинхронного поведения этого метода. Это означает, что к тому времени, когда вы пытаетесь использовать список Pt вне этого метода, данные еще не завершили загрузку из базы данных, и поэтому они недоступны.

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

0 голосов
/ 27 июня 2018

Попробуйте этот код ..

private List<String> stringList=new ArrayList<>(); // define as class level

query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if(dataSnapshot!=null) {
        Log.e("TAG", String.valueOf(dataSnapshot.child("uid").child("Name")));
        int i=0;
        for(DataSnapshot snapshot : dataSnapshot.getChildren()){
            String userName = snapshot.child("Name").getValue(String.class);
            Pt.add(userName);
            //Toast.makeText(getApplicationContext(),  dataSnapshot.toString(), Toast.LENGTH_SHORT).show();
        }
    } else {
        Toast.makeText(getApplicationContext(), "Datasnapshot is null", Toast.LENGTH_SHORT).show();
     }
}
        ArrayAdapter<String>adapter=new ArrayAdapter<>(MainActivity.this,android.R.layout.simple_list_item_1,stringList);
    listView.setAdapter(adapter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...