具有 Parse.com (Android) 的自动完成文本视图
AutoCompleteTextView with Parse.com (Android)
总的来说,我是 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 table 实现自动完成功能,尤其是当 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 个用户,这是我的应用程序中目前有多少用户?
这似乎有效。它是静态的,因为它总是打印出您的用户 class 中的前 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());
}
}
});
总的来说,我是 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 table 实现自动完成功能,尤其是当 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 个用户,这是我的应用程序中目前有多少用户?
这似乎有效。它是静态的,因为它总是打印出您的用户 class 中的前 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());
}
}
});