AutoCompleteTextview 不显示第一个字符条目的下拉建议
AutoCompleteTextview doesn't show dropdown suggestion for first character entry
我有一个 AutoCompleteTextView
searchFriends
和一个 String[] usernames= {"Lex","Lincoln","Luther"}
是从数据库中获取的。
问题:我第一次在 AutoCompleteTextView
中输入字母 "L" 时,没有显示任何建议。如果我按退格键删除 "L",然后再次重新键入 "L",则建议使用 "Lex"、"Lincoln" 和 "Luther"。我希望在第一次输入内容时显示建议。
public class SearchFriendsActivity extends AppCompatActivity {
Firebase userbase;
AutoCompleteTextView searchFriends;
ArrayAdapter adapter;
char firstChar;
String url, listOfusers, inputUsername, userss;
String[] usersArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_friends);
searchFriends= (AutoCompleteTextView)findViewById(R.id.searchFriends);
searchFriends.addTextChangedListener(new TextWatcher() {
private Timer timer = new Timer();
private final long DELAY = 1000; // milliseconds
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
timer.cancel();
timer = new Timer();
timer.schedule(
new TimerTask() {
@Override
public void run() {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
if (s.length() == 0) {
firstChar = '.';
} else {
if (firstChar == s.charAt(0)) {
aVoid();
} else {
firstChar = s.charAt(0);
url = @string/databaseString + firstChar.toString() + "/";
userbase = new Firebase(url);
createArray();
}
}
}
});
}
},
DELAY
);
}
});
}
public void createArray() {
userbase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
listOfusers = dataSnapshot.getValue().toString();
userss = listOfusers.replaceAll("=.*?\}", "").replace("{", "").replace("}", "").replace(", ", ",");
usersArray = userss.split(",");
aVoid();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
public void aVoid() {
adapter = new ArrayAdapter(this, R.layout.suggestion_dropdown_item, usersArray);
searchFriends.setThreshold(1);
searchFriends.setAdapter(adapter);
}
}
在适配器中拥有整个列表后,就这么简单:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Filterable adapter = (Filterable) searchFriends.getAdapter();
adapter.getFilter().filter(s);
}
尝试将 onTextChanged
中的代码放入 afterTextChange
,因为在 onTextChanged
中,每次输入字符时,AutoCompleteTextView
中的文本尚未设置为它。因此,在您的第一个输入(例如 "L")中,AutoCompleteTextView.getText().toString;
的值仍然是 null
,这就是您遇到问题的原因。
onTextChanged
通常用于捕获按下的键以执行检查或验证,然后再将其附加到 AutoCompleteEditText
.
的先前值
另一方面,aftetTextChange
在 AutoCompleteEditText
的先前值更改后被触发(顾名思义)。所以你的代码最好放在 afterTextChanged
而不是 onTextChanged
.
我通过在创建适配器后立即用编辑文本中的相同文本替换文本来解决这个问题:
public void replaceAllText() {
Timer timer = new Timer();
final long DELAY = 300; // milliseconds
timer.cancel();
timer = new Timer();
timer.schedule(
new TimerTask() {
@Override
public void run() {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
String replace = searchFriends.getText().toString();
searchFriends.setText(replace);
searchFriends.setSelection(searchFriends.getText().length());
}
});
}
},
DELAY
);
}
将这一行添加到 AutoCompleteTextView
android:completionThreshold="1"
我有一个 AutoCompleteTextView
searchFriends
和一个 String[] usernames= {"Lex","Lincoln","Luther"}
是从数据库中获取的。
问题:我第一次在 AutoCompleteTextView
中输入字母 "L" 时,没有显示任何建议。如果我按退格键删除 "L",然后再次重新键入 "L",则建议使用 "Lex"、"Lincoln" 和 "Luther"。我希望在第一次输入内容时显示建议。
public class SearchFriendsActivity extends AppCompatActivity {
Firebase userbase;
AutoCompleteTextView searchFriends;
ArrayAdapter adapter;
char firstChar;
String url, listOfusers, inputUsername, userss;
String[] usersArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_friends);
searchFriends= (AutoCompleteTextView)findViewById(R.id.searchFriends);
searchFriends.addTextChangedListener(new TextWatcher() {
private Timer timer = new Timer();
private final long DELAY = 1000; // milliseconds
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
timer.cancel();
timer = new Timer();
timer.schedule(
new TimerTask() {
@Override
public void run() {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
if (s.length() == 0) {
firstChar = '.';
} else {
if (firstChar == s.charAt(0)) {
aVoid();
} else {
firstChar = s.charAt(0);
url = @string/databaseString + firstChar.toString() + "/";
userbase = new Firebase(url);
createArray();
}
}
}
});
}
},
DELAY
);
}
});
}
public void createArray() {
userbase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
listOfusers = dataSnapshot.getValue().toString();
userss = listOfusers.replaceAll("=.*?\}", "").replace("{", "").replace("}", "").replace(", ", ",");
usersArray = userss.split(",");
aVoid();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
public void aVoid() {
adapter = new ArrayAdapter(this, R.layout.suggestion_dropdown_item, usersArray);
searchFriends.setThreshold(1);
searchFriends.setAdapter(adapter);
}
}
在适配器中拥有整个列表后,就这么简单:
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Filterable adapter = (Filterable) searchFriends.getAdapter();
adapter.getFilter().filter(s);
}
尝试将 onTextChanged
中的代码放入 afterTextChange
,因为在 onTextChanged
中,每次输入字符时,AutoCompleteTextView
中的文本尚未设置为它。因此,在您的第一个输入(例如 "L")中,AutoCompleteTextView.getText().toString;
的值仍然是 null
,这就是您遇到问题的原因。
onTextChanged
通常用于捕获按下的键以执行检查或验证,然后再将其附加到 AutoCompleteEditText
.
aftetTextChange
在 AutoCompleteEditText
的先前值更改后被触发(顾名思义)。所以你的代码最好放在 afterTextChanged
而不是 onTextChanged
.
我通过在创建适配器后立即用编辑文本中的相同文本替换文本来解决这个问题:
public void replaceAllText() {
Timer timer = new Timer();
final long DELAY = 300; // milliseconds
timer.cancel();
timer = new Timer();
timer.schedule(
new TimerTask() {
@Override
public void run() {
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
String replace = searchFriends.getText().toString();
searchFriends.setText(replace);
searchFriends.setSelection(searchFriends.getText().length());
}
});
}
},
DELAY
);
}
将这一行添加到 AutoCompleteTextView
android:completionThreshold="1"