I have an AutoCompleteTextView
searchFriends
and a String[] usernames= {"Lex","Lincoln","Luther"}
that I get from a database.
Problem: The first time I type in the letter "L" in the AutoCompleteTextView
, no suggestions are shown. If I press backspace to remove the "L" and then retype "L" again, then "Lex", "Lincoln" and "Luther" are suggested. I want suggestions to be shown the first time something is entered.
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);
}
}
I worked around this problem by replacing the text with the same text in the edittext a moment after the adapter is created:
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
);
}