【问题标题】:Trying to populate a ListView with results from a Parse query尝试使用 Parse 查询的结果填充 ListView
【发布时间】:2015-10-26 16:15:01
【问题描述】:

我有一个用户注册和登录的简单应用,我希望他们能够搜索其他用户。

我正在使用 parse.com 来存储我的用户及其详细信息,并且一直在寻找一种方法来搜索用户(使用姓名、电话号码、电子邮件等)并将它们全部显示在列表视图中,但我空空如也。大多数答案和教程都涉及使用 ParseQueryAdapter,但看起来该类不再包含在 SDK 中。

有人有这方面的经验吗?

感谢您的宝贵时间

编辑:我一直在搞乱 ParseQuery,试图得到一些东西。这是我目前所拥有的:

 searchButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                ParseQuery<ParseUser> query = ParseUser.getQuery();
                //TODO search function

                query.whereContains("name", searchText.getText().toString().trim());
                query.findInBackground(new FindCallback<ParseUser>() {
                    @Override
                    public void done(List<ParseUser> objects, ParseException e) {
                        if (e == null) {
                            Log.d("Brand", "Retrieved " + objects.size() + " Brands");
                            for (ParseObject dealsObject : objects)
                            {
                                Log.i("USERNAME", dealsObject.getString("name"));
                                // use dealsObject.get('columnName') to access the properties of the Deals object.
                            }
                        } else {
                            Log.d("Brand", "Error: " + e.getMessage());
                        }
                    }
                });


            }
        });

此代码将搜索结果的数量以及每个测试结果的“名称”属性输出到日志。

此外,我已经为列表视图中的每个项目进行了布局,其中包含姓名、电子邮件、电话号码等详细信息。早些时候,在我开始使用 Parse 之前,我使用本地 MySQL 数据库来存储我的用户。然后,我将搜索返回 JsonArray 的用户,并将每个属性放入自定义的“searchresult”对象中,该对象具有用于搜索属性的 get() 和 set() 方法。之后,我有一个 ArrayAdapter,我将结果添加到其中。这种方法效率有点低,尤其是因为我不是 PHP 和 Json 方面的专家。

【问题讨论】:

  • 我假设您使用的是 SDK 的 ParseQuery。 (如果是这样,请在问题中指出。)你能告诉我们你是如何使用它的吗?例如,硬编码从 your 数据集获取结果的查询?一旦我们有了这些,我们就可以向您展示如何使用结果构建ListView
  • 到目前为止,我还没有一个有效的 ParseQuery,因为我一直在试图弄清楚它是如何工作的,以及它是如何返回结果的。理想情况下,我认为我需要它来返回与搜索字符串匹配的用户列表。我会用我目前所拥有的更新帖子
  • Thisthisthis 应该让你继续前进。 你得到返回结果的东西时,那么你的 ListView 问题是相关的。只要确保您发布工作代码供我们使用。
  • 我用一些返回结果的代码编辑了帖子。尽管这仅按“名称”搜索,但理想情况下它会搜索每个字段。不过感谢您的链接,我一定会检查出来
  • 你试过whereStartsWith

标签: java android listview search parse-platform


【解决方案1】:

你可以这样试试

query.whereContains("name", searchText.getText().toString().trim());
query.whereContains("phone", searchText.getText().toString().trim());
query.whereContains("emails", searchText.getText().toString().trim());

【讨论】:

  • 天哪,我一定会试试这个,我没想到。这将解决我的问题的一部分,我想我可以实现我以前的类来填写 ListView。
  • 刚试了一下,好像不行。我想如果我这样做,它会在“姓名”和“电话”等中寻找匹配项,但我需要它是一个 OR。如果在其任何字段中找到搜索参数,则需要返回用户。
  • 刚刚想通了,需要创建几个不同的查询,每个字段约束一个,然后添加到查询列表中。之后,将创建 ParseQuery.or() 类型的另一个查询,该查询将查询列表作为参数。
【解决方案2】:

找到了一种方法来做到这一点。首先,搜索匹配任意字段的任意用户:

String searchParams = searchText.getText().toString().trim();

                if(!searchParams.isEmpty()) {
                    final ArrayList<SearchResults> searchResults = new ArrayList<SearchResults>();
                    listAdapter = new ListAdapter(activityContext, searchResults);
                    listView.setAdapter(listAdapter);

                    ParseQuery<ParseUser> queryName = ParseUser.getQuery();
                    queryName.whereContains("name", searchParams);
                    ParseQuery<ParseUser> queryPhone = ParseUser.getQuery();
                    queryPhone.whereContains("username", searchParams);
                    ParseQuery<ParseUser> queryEmail = ParseUser.getQuery();
                    queryEmail.whereContains("email", searchParams);
                    ParseQuery<ParseUser> querySurname1 = ParseUser.getQuery();
                    querySurname1.whereContains("surname1", searchParams);
                    ParseQuery<ParseUser> querySurname2 = ParseUser.getQuery();
                    querySurname2.whereContains("surname2", searchParams);

                    List<ParseQuery<ParseUser>> queries = new ArrayList<ParseQuery<ParseUser>>();
                    queries.add(queryName);
                    queries.add(queryPhone);
                    queries.add(queryEmail);
                    queries.add(querySurname1);
                    queries.add(querySurname2);

                    ParseQuery<ParseUser> mainQuery = ParseQuery.or(queries);

                    mainQuery.findInBackground(new FindCallback<ParseUser>() {
                        @Override
                        public void done(List<ParseUser> objects, ParseException e) {
                            if (e == null)
                            {
                                Log.d("Brand", "Retrieved " + objects.size() + " Brands");
                                for (ParseObject dealsObject : objects) {
                                    Log.i("USERNAME", dealsObject.getString("name"));
                                    Log.i("PRIVATE", Integer.toString(dealsObject.getInt("private")));
                                    SearchResults sr1 = new SearchResults();
                                    sr1.setName(dealsObject.getString("name"));
                                    sr1.setSurname1(dealsObject.getString("surname1"));
                                    sr1.setSurname2(dealsObject.getString("surname2"));
                                    sr1.setUid(dealsObject.getObjectId());
                                    Log.d("UID",dealsObject.getObjectId());

                                    if(dealsObject.getInt("private") == 0)
                                    {
                                        sr1.setEmail(dealsObject.getString("email"));
                                        sr1.setPhone(dealsObject.getString("username"));
                                    }
                                    else
                                    {
                                        sr1.setPhone("xxx-xxx-xxx");
                                        sr1.setEmail("xxxxxx@xxxxx.xxx");
                                    }

                                    searchResults.add(sr1);
                                }
                            } else {
                                Log.d("Brand", "Error: " + e.getMessage());
                            }

                            listAdapter.notifyDataSetChanged();

还有我的 SearchResults 类:

public class SearchResults
{
    private String name = "";
    private String surname1 = "";
    private String surname2 = "";
    private String phone = "";
    private String email = "";
    private Bitmap image;
    private String uid = "";

    public String getEmail() {
        return email;
    }

    public String getName() {
        return name;
    }

    public String getPhone() {
        return phone;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Bitmap getImage() {
        return image;
    }

    public void setImage(Bitmap image) {
        this.image = image;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getSurname1() {
        return surname1;
    }

    public String getSurname2() {
        return surname2;
    }

    public void setSurname1(String surname1) {
        this.surname1 = surname1;
    }

    public void setSurname2(String surname2) {
        this.surname2 = surname2;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 2019-09-19
    • 2015-12-07
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多