当前位置: 首页 > 知识库问答 >
问题:

如何使用android searchView从firebase firestore中搜索数据列表

邓俊英
2023-03-14
@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;
    }
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”)

共有1个答案

宦树
2023-03-14

多亏了@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);
    }

在这里,我通知RecycerView的适配器数据发生了更改:

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();
    }
 @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;
    }
 类似资料:
  • 我在WordPress中进行自定义搜索。有三个字段可供搜索。 年龄 位置 职称 从

  • 问题内容: 我在netbeans中创建了jtable,并在jtable中填充了数据库中的数据,但是我无法使用jtextfield在jtable中实现搜索选项。谁能指导我。谢谢 问题答案: 为了在表上搜索内容,必须将原始内容存储在某个变量中。在下面的示例中,我将表模型的初始值存储在向量中。 下面有两种实现方式:一种是在文本字段上键入内容后立即进行搜索,另一种则仅在单击按钮后进行搜索。 对于第一个,您

  • 问题内容: 我如何从mysql类语句以外的mysql数据库中的序列化字段中搜索? 数据为: 我需要其中m9值为“是,是”的行。我不想使用mysql的“ like”语句。 我努力了: 你能帮忙吗? 问题答案: 我发现一种使用正则表达式的解决方案: 希望这可以帮助: http://www.namasteui.com/search-from-serialize-field-in-mysql- datab

  • 问题内容: 如何使用preg_match在数组中搜索? 例: 问题答案: 在这篇文章中,我将为您提供三种不同的方法来满足您的要求。 我实际上建议使用最后一个代码段,因为它最容易理解并且代码简洁。 如何查看数组中与我的正则表达式匹配的元素? 有专门用于此目的的功能。它将一个正则表达式作为第一个参数,并将一个数组作为第二个参数。 请参见以下示例: 输出 但是我只想获取指定组的值。怎么样? 与能解决清洁

  • 我有一个名为employee_comp_field的表,其中提供了薪资字段 然后,我有另一个表,其中员工工资数据存储emp_compensation每个字段。正如你所看到的emp_id 10有三套记录,因为他在同一年获得了三次加薪(year_id=101),这可以通过salary_order领域来识别。 我想用最大工资确定所有雇员的名单,我的期望输出如下: emp_id10号得到了三次加薪……所以

  • 我不理解高级REST客户机(它取代了传输客户机)和Spring Data ElasticSearch之间的关系。 有一些教程(https://www.baeldung.com/spring-data-elasticsearch-tutorial)展示了如何使用像getSomethingById()这样的自动实现方法进行JPA风格的查询。他们利用这个接口: 所以如果我想使用最新的官方客户端,对我来说