【问题标题】:AutoCompleteTextView with Parse.com (Android)带有 Parse.com 的 AutoCompleteTextView (Android)
【发布时间】:2016-03-20 04:43:32
【问题描述】:

我是 Android 新手,所以我查阅了 AutoCompleteTextView 的文档。

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        android.R.layout.simple_dropdown_item_1line, USERS);
AutoCompleteTextView textView = (AutoCompleteTextView)
        findViewById(R.id.searchUserTextField);
textView.setAdapter(adapter);

我发现它只需很少的代码就可以启动并运行。

private static final String[] COUNTRIES = new String[] {
        "user1", "user1", "user3", "user4", "user5"
};

我意识到这有点牵强,但是关于基于我的 ParseUser 表实现自动完成功能的下一步是什么,特别是当AutoCompleteTextView 中的文本一次更改一个字符时?显然,我不会使用 Parse 查询填充 USERS 数组,该查询会在每次尝试搜索时显示我的所有用户。我该如何合理安排这样的事情?

首先,我可能会添加一个TextChangedListener

adapter.setNotifyOnChange(true);
    textView.addTextChangedListener(new TextWatcher() {
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            if (count % 3 == 1) {
                new Handler().postDelayed(new Runnable() {

                    @Override
                    public void run() {
                        textview.setDropDownHeight(LayoutParams.WRAP_CONTENT);
                        adapter.clear();
                        // Run my background task here


                    }
                }, 1000);
            }
        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {

        }

        public void afterTextChanged(Editable s) {

        }
    });
    textView.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> adapterview, View v,
                int position, long arg3) {
            // TODO Auto-generated method stub
            searchUserTextField.setText(adapterview.getItemAtPosition(position)
                    .toString());
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub

        }
    });

但是我会提供什么作为后台任务?我在查询什么而不是一次搜索 1000 个用户,这就是我的应用中目前有多少用户?

【问题讨论】:

  • 您的用例是什么?例如,您是否希望任何用户搜索任何用户?或者只是来自他们之前搜索过/联系过的人? ParseUser 表存储在哪里?
  • ParseUser 表是指查询 Parse 中的标准 User 类。我会说他们应该能够搜索任何用户,因此输入字母“s”将显示前 100 个以 s 开头的用户(我认为 Parse 默认将查询限制为 100);例如,键入“sa”会缩小搜索条件,以此类推,然后向“sally”方向发展。
  • 也许只有在文本有一段时间没有改变的情况下才运行查询,也许是半秒左右。因此,当文本更改时,设置时间戳并延迟发布到处理程序。延迟后,如果时间戳未更改,则运行查询。就在我的脑海中。

标签: java android parse-platform autocomplete autocompletetextview


【解决方案1】:

这似乎有效。它是静态的,因为它总是打印出您的 User 类中的前 100 个用户。我确定您可以将与 AutoCompleteTextView 的第一个或第二个字母匹配的约束添加到用户名。

ParseQuery<ParseUser> userQuery = ParseUser.getQuery();
userQuery.findInBackground(new FindCallback<ParseUser>() {
    public void done(List<ParseUser> parseUsers, ParseException e) {
        if (e == null) {
            Log.d("users", "Retrieved " + parseUsers.size());
            ParseUser[] data = parseUsers.toArray(new ParseUser[parseUsers.size()]);
            String[] strings = new String[data.length];
            for (int i = 0; i < data.length; i++) {
                strings[i] = data[i].getString(ParseConstants.KEY_USERNAME);
            }
            // Test to see if it was correctly printing out the array I wanted.
            // System.out.println(Arrays.toString(strings));
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_dropdown_item_1line, strings);
            AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.searchUserTextField);
            if(parseUsers.size() < 40) textView.setThreshold(1);
            else textView.setThreshold(2);
            textView.setAdapter(adapter);
        } else {
            Log.d("users", "Error: " + e.getMessage());
        }
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多