Вопрос:

AutoCompleteTextview не показывает раскрывающийся список для ввода первого символа

java android arrays autocompletetextview

558 просмотра

4 ответа

384 Репутация автора

У меня есть AutoCompleteTextView searchFriendsи, String[] usernames= {"Lex","Lincoln","Luther"}что я получаю из базы данных.

Проблема: При первом вводе буквы «L» AutoCompleteTextViewпредложения не отображаются. Если я нажму клавишу Backspace, чтобы удалить букву «L», а затем снова наберу «L», то будут предложены «Лекс», «Линкольн» и «Лютер». Я хочу, чтобы предложения показывались при первом вводе.

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);
}
}
Автор: Lincoln White Источник Размещён: 14.07.2016 03:36

Ответы (4)


1 плюс

24669 Репутация автора

Когда у вас есть весь список в адаптере, это так просто:

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        Filterable adapter = (Filterable) searchFriends.getAdapter();
        adapter.getFilter().filter(s);
    }
Автор: kris larson Размещён: 14.07.2016 03:40

1 плюс

124 Репутация автора

Попробуйте поместить код внутри onTextChangedв afterTextChangeпотому , что в onTextChangedтексте внутри AutoCompleteTextViewеще не установлен на нем evertime вы вводите символ. Итак, на вашем первом входе (например, «L») значение по- AutoCompleteTextView.getText().toString;прежнему null, поэтому у вас есть проблемы.

onTextChangedобычно используется для захвата нажатой клавиши для выполнения проверки или проверки перед добавлением ее к предыдущему значению AutoCompleteEditText.

aftetTextChangeс другой стороны, запускается (как следует из названия) после изменения предыдущего значения AutoCompleteEditText. Таким образом, ваш код лучше поместить внутрь, afterTextChangedа не в onTextChanged.

Автор: Karyuu Ouji Размещён: 14.07.2016 03:44

0 плюса

384 Репутация автора

Решение

Я обошел эту проблему, заменив текст тем же текстом в тексте редактирования через мгновение после создания адаптера:

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
    );
}
Автор: Lincoln White Размещён: 01.08.2016 09:28

0 плюса

1 Репутация автора

Добавьте эту строку в AutoCompleteTextView

android:completionThreshold="1"
Автор: AUPMA PLiX Размещён: 11.08.2019 07:23
Вопросы из категории :
32x32