java - 如何使用来自 Firebase 的数据填充 ListView?

标签 java android multithreading listview firebase

ListView listView = (ListView) findViewById(R.id.listView);
    final ArrayList<String> friends = new ArrayList<String>();
    players.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot player : dataSnapshot.getChildren()) {
                Log.i("player", player.getKey());
                friends.add(player.getKey());

            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

    while (friends.isEmpty()) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

        // link between a set of data and the AdapterView that displays the data
        ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,
                friends);
        listView.setAdapter(arrayAdapter);

我预计它会让当前线程等待,直到 Firebase 的线程获取所有数据并将其存储到 friends 数组列表中,但我只在我的 Android 模拟器上黑屏。 任何人都可以就如何完成这项任务提出任何建议吗?

最佳答案

那是因为 Thread.sleep(1000); 阻塞了 UI 线程。你永远不应该那样做。相反,您应该创建适配器并将其添加到 onDataChange 回调中的列表。像这样:

final ListView listView = (ListView) findViewById(R.id.listView);
final ArrayList<String> friends = new ArrayList<String>();
players.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot player : dataSnapshot.getChildren()) {
            Log.i("player", player.getKey());
            friends.add(player.getKey());
        }
        ArrayAdapter arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1,
            friends);
        listView.setAdapter(arrayAdapter);
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});

关于java - 如何使用来自 Firebase 的数据填充 ListView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37291606/

相关文章:

java - iBatis SqlMapClient 和线程安全

java - 此位置不允许使用注释 @Index

java - 在java中读取txt文件,程序跳过第一行

android - 如果使用标准 Fragment,LiveData 不会调用 LifecycleRegistryOwner

Android BroadcastReceiver 和开始一个 Intent

java - Akka调度程序: How akka scheduler work?

multithreading - java.net.SocketException : Socket closed at the end of the script duration when using Jmeter Concurrency Thread Group

multithreading - 只有多处理还是单个进程的多线程也使用多核?

java - Java 中的页面过期(Wicket)

android - FFmpeg 缩放错误