Java AutoCompleteTextview不';t显示第一个字符输入的下拉建议
我有一个Java AutoCompleteTextview不';t显示第一个字符输入的下拉建议,java,android,arrays,autocompletetextview,Java,Android,Arrays,Autocompletetextview,我有一个AutoCompleteTextViewsearchFriends和一个String[]usernames={“Lex”、“Lincoln”、“Luther”}从数据库中获取 问题:我第一次在AutoCompleteTextView中键入字母“L”,没有显示任何建议。如果我按backspace删除“L”,然后再次键入“L”,则建议使用“Lex”、“Lincoln”和“Luther”。我希望在首次输入内容时显示建议 public class SearchFriendsActivity ex
AutoCompleteTextView
searchFriends
和一个String[]usernames={“Lex”、“Lincoln”、“Luther”}
从数据库中获取
问题:我第一次在AutoCompleteTextView
中键入字母“L”,没有显示任何建议。如果我按backspace删除“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
中的代码放入extextchange
中,因为在onTextChanged
中,每次输入字符时,AutoCompleteTextView
中的文本尚未设置为该文本。因此,在您的第一次输入(例如“L”)中,AutoCompleteTextView.getText().toString的值
仍然是null
,这就是您遇到问题的原因
onTextChanged
通常用于捕获按下的键,以执行检查或验证,然后将其附加到自动完成编辑文本的上一个值中
另一方面,afttextchange
在AutoCompleteEditText
的上一个值更改后被激发(顾名思义)。因此,最好将代码放在后文本更改
中,而不是放在后文本更改
中。我解决了这个问题,在创建适配器后不久,用编辑文本中的相同文本替换文本:
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"
哎呀。更新的答案。我得到这个空指针错误java.lang.NullPointerException:尝试在空对象referenceAh上调用虚拟方法“android.widget.Filter android.widget.ArrayAdapter.getFilter()”。可以因此,这会稍微更改您的代码,因为您现在要做的是在用户每次键入密钥时加载新的Firebase数据。那不是很有效率。您需要做的是首先使用Firebase中的数据创建ArrayAdapter
,然后当用户键入时,ArrayAdapter
将过滤该数据并更新自动完成下拉列表,因此您不需要经常访问Firebase。尝试了它,但没有效果