如何获取所有将 userId 作为其 phone 号码的用户的姓名并将其存储在列表视图中?

how to get all names of users having userId as their phone number and store it in a listview?

我收集了“用户”,他们的文档作为 phone 编号存储在 Firebase Firestore 中。 当我单击 phone 号码时,它会显示用户详细信息。

现在我想获取所有用户的所有姓名并将姓名列表存储在列表视图中。例如,有 10 个用户,用户 ID 是他们的 phone 号码,他们存储了名称、密码和电子邮件。所以我只想在列表视图中显示 10 个用户名 我不知道如何执行查询。请帮我解决一下这个。以下代码仅显示一个用户的每个值,但我只想要每个用户的名称

public class solo_m1_participants extends Fragment {

    private ListView listView;
    private FirebaseFirestore db = FirebaseFirestore.getInstance();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_solo_m1_participants, container, false);

        listView = view.findViewById(R.id.list_view);

        db.collection("users")
                .get()
                .addOnCompleteListener(task -> {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {

                            String value = document.getData()+"\n";
                            ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),
                                    android.R.layout.simple_list_item_1, Collections.singletonList(value));
                            listView.setAdapter(adapter);
                            Log.d(TAG, document.getId() + " => " + document.getData());
                        }
                    } else {
                        Log.d(TAG, "Error getting documents: ", task.getException());
                    }
                });

        return view;
    }
}

您的代码中的问题在于您正在创建 ArrayAdapter 的新实例 class,在 for 循环的每次迭代中,这意味着您最终将只有一个显示的用户,而不是所有用户。解决这个问题的关键是创建一个带有空列表的适配器,并在回调中用来自数据库的结果填充该列表。获得数据后,只需将更改通知适配器,如我在以下答案中所述:

I have made a small problem otherwise everything is ok

private ListView listView;
private final FirebaseFirestore db = FirebaseFirestore.getInstance();

ArrayList<String> userName =  new ArrayList<>();
@SuppressLint("SetTextI18n")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_solo_m1_participants, container, false);

            listView = view.findViewById(R.id.list_view);

            db.collection("users")
                    .get()
                    .addOnCompleteListener(task -> {
                        if (task.isSuccessful()) {
                            userName.clear();
                            for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
                                userName.add(document.getString("Name"));
                            }
                            ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),
                                    android.R.layout.simple_list_item_1, userName);
                            listView.setAdapter(adapter);
                        } else {
                            userName.clear();
                            ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),
                                    android.R.layout.simple_list_item_1, userName);
                            listView.setAdapter(adapter);
                        }
                    });

            return view;
}