Как искать список данных из Firebase FireStore с помощью Android SearchView - PullRequest
0 голосов
/ 01 января 2019

Я использую Cloud Firestore Firebase для хранения пользователей и Android SearchView для обеспечения поисковой функциональности.Когда пользователь ищет «Джонатан», например, если он начинает вводить «j», я хочу ввести всех пользователей с именем, начинающимся с «j».Как я могу достичь этого?

Вот что я пробовал:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        MenuItem search = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) search.getActionView();

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                //Toast.makeText(MainActivity.this, "SEARCH " + query, Toast.LENGTH_LONG).show();
                searchUsers(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                //Toast.makeText(MainActivity.this, "SEARCH " + newText, Toast.LENGTH_LONG).show();
                searchUsers(newText);
                return false;
            }
        });

        return true;
    }

Получение пользователя из Firebase:

private void searchUsers(String recherche) {
    if(recherche.length() > 0)
    recherche = recherche.substring(0,1).toUpperCase() + recherche.substring(1).toLowerCase();
    listUsers = new ArrayList<>();

    db.collection("users").whereGreaterThanOrEqualTo("name", recherche)
            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(@Nullable QuerySnapshot snapshots,
                                    @Nullable FirebaseFirestoreException e) {
                    if (e != null) {
                        System.err.println("Listen failed:" + e);
                        return;
                    }
                    listUsers = new ArrayList<User>();

                    for (DocumentSnapshot doc : snapshots) {
                        User user = doc.toObject(User.class);
                        listUsers.add(user);
                    }
                    updateListUsers(listUsers);
                }
            });
}

Это работает только для первой буквы "j", как толькоя добавляю "ja", например, у меня все еще отображается "jonathan"

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Благодаря предложению @Oby, если найдено решение.На самом деле мне не нужно запрашивать базу данных каждый раз, когда поиск запускается, так как у меня есть список пользователей.Я просто должен сделать поиск по списку следующим образом: Сначала мы получаем список:

private void getUsers() {
        db.collection("users").whereEqualTo("etat", 1)
                .addSnapshotListener(new EventListener<QuerySnapshot>() {
                    @Override
                    public void onEvent(@Nullable QuerySnapshot snapshots,
                                        @Nullable FirebaseFirestoreException e) {
                        if (e != null) {
                            System.err.println("Listen failed:" + e);
                            return;
                        }
                        listUsers = new ArrayList<User>();

                        for (DocumentSnapshot doc : snapshots) {
                            User user = doc.toObject(User.class);
                            listUsers.add(user);
                        }
                        updateListUsers(listUsers);
                    }
                });
    }

Вот функция поиска:

private void searchUsers(String recherche) {
        if (recherche.length() > 0)
            recherche = recherche.substring(0, 1).toUpperCase() + recherche.substring(1).toLowerCase();

        ArrayList<User> results = new ArrayList<>();
        for(User user : listUsers){
            if(user.getName() != null && user.getName().contains(recherche)){
                results.add(user);
            }
        }
        updateListUsers(results);
    }

Здесь я уведомляю Адаптер оRecyclerView, что данные изменились:

private void updateListUsers(ArrayList<User> listUsers) {

        // Sort the list by date
        Collections.sort(listUsers, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                int res = -1;
                if (o1.getDate() > (o2.getDate())) {
                    res = 1;
                }
                return res;
            }
        });

        userRecyclerAdapter = new UserRecyclerAdapter(listUsers, InvitationActivity.this, this);
        rvUsers.setNestedScrollingEnabled(false);
        rvUsers.setAdapter(userRecyclerAdapter);
        layoutManagerUser = new LinearLayoutManager(getApplicationContext());
        rvUsers.setLayoutManager(layoutManagerUser);
        userRecyclerAdapter.notifyDataSetChanged();
    }

И, конечно, SearchView:

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        MenuItem search = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) search.getActionView();

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String query) {
                //Toast.makeText(MainActivity.this, "SEARCH " + query, Toast.LENGTH_LONG).show();
                searchUsers(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                //Toast.makeText(MainActivity.this, "SEARCH " + newText, Toast.LENGTH_LONG).show();
                searchUsers(newText);
                return false;
            }
        });

        return true;
    }
0 голосов
/ 01 января 2019

Мой способ поиска довольно неэффективен, так как я использую два окна повторного просмотра: одно скрытое, а другое с видимыми данными.Все данные в документе извлекаются в массив, и я запрашиваю массив в режиме реального времени, как вы хотите.Данные остаются синхронизированными всегда, поэтому они выглядят в режиме реального времени. Не очень хорошая практика, но она выполняет работу за меня. Если вам понадобится дополнительная помощь, я могу создать для вас суть.Правильный способ будет использовать эту официальную ссылку для поиска именно того, что вам нужно [https://firebase.google.com/docs/firestore/solutions/search][1]

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