Подтвердить что ты не робот

AutoCompleteTextView не показывает выпадающее меню, когда я нажимаю пробел после ввода полного слова

Мой основной код активности:

// here you put all your data.
String[] dataArray = { "Amit sharma Kumar", "Hisham Kumar Munner",
        "Vineet John Chaturvedi", "Lucky Kumar Verma" };

ArrayList<String> alAutoCompleteList;
AutoCompleteTextView acTV;
ArrayAdapter<String> adapter1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // etAuto = (EditText) findViewById(R.id.etAuto);
    acTV = (AutoCompleteTextView) findViewById(R.id.acTV);
    // Arraylist
    alAutoCompleteList = new ArrayList<String>();
    adapter1 = new ArrayAdapter<String>(MainActivity.this,
            android.R.layout.simple_dropdown_item_1line,     alAutoCompleteList);


    acTV.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub
            if (acTV.enoughToFilter()) {
                acTV.showDropDown();
                acTV.bringToFront();
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
            alAutoCompleteList.clear();
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

            String acText = acTV.getText().toString().trim();

            for (String item : dataArray) {

                if     (item.toLowerCase().contains(acText.toLowerCase())) {
                    alAutoCompleteList.add(item);
                }
            }


            acTV.setThreshold(4);
            acTV.setAdapter(adapter1);
            acTV.showDropDown();

        }
    });

Когда я ищу "sharma" и нажимаю пробел, после этого предложения уходят. Я хочу, чтобы эти предложения остались там. Я пытался сделать все, но не получил никакого успеха. Кто-нибудь может помочь?

Изменить: Может ли кто-нибудь попробовать этот код на своих эмуляторах? Просто добавьте AutoCompleteTextView в xml и запустите его.

4b9b3361

Ответ 1

Во-первых, есть ли причина, по которой вы устанавливаете этот TextWatcher прослушиватель на AutoCompleteTextView? Если вы сделали это, чтобы отфильтровать данные самостоятельно, вы не должны этого делать (потому что виджет делает это по умолчанию, а ваш код неверен).

Когда я просматриваю "sharma" и нажимаю пробел после этого. предложения идут выкл. Я хочу, чтобы эти предложения остались там.

Это происходит из-за адаптера и реализации по умолчанию Filter, которая поставляется вместе с ним, элементов, которые AutoCompleteTextView использует под капотом, чтобы предоставить значения, которые вы видите в раскрывающемся списке. Поведение по умолчанию для ArrayAdapter - это тот, который вы видите, вы можете найти объяснение в этом ответе. Решение состоит в том, чтобы реализовать собственный адаптер с фильтром, который будет искать все данные строки адаптера для строки фильтра. Я взял код класса ArrayAdapter из SDK и сделал небольшую настройку, поэтому фильтрация не прерывается при вставке пробела после слова. Вы можете найти класс здесь, так как код будет большой для публикации. Просто скопируйте класс в свой проект и используйте его как обычный ArrayAdapter:

FilterWithSpaceAdapter<String> adapter1;
//... 
adapter1 = new FilterWithSpaceAdapter<String>(MainActivity.this,
            android.R.layout.simple_dropdown_item_1line, dataArray);

Ответ 2

Прежде всего, вам не нужно TextWatcher с AutoCompleteTextView, потому что AutoCompleteTextView имеет свой собственный метод для просмотра текста i.e. MyWatcher. Вам необходимо использовать:

setThreshold(3);
final String[] AndroidDesk= getResources().getStringArray(R.array.clothname_arrays);
ArrayAdapter<String> My_arr_adapter= new ArrayAdapter<String>(getApplicationContext(),
            android.R.layout.simple_dropdown_item_1line,AndroidDesk);      
   cloths.setThreshold(1);
   cloths.setAdapter(My_arr_adapter);
   cloths.setOnItemClickListener(new OnItemClickListener() {
   public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {                               
   }
   });

Ответ 3

Вам не нужен Textwatcher, AutoCompleteTextView использует фильтр адаптера, который вы установили. Адаптер по умолчанию фильтрует записи, вызывая toString() на них. Естественно, если пользователь вводит пробел, значения больше не совпадают. Чтобы реализовать это поведение, вы не должны добавлять текстовый элемент, а создавать пользовательский адаптер. Вы все равно можете расширить ArrayAdapter или SimpleAdapter. Вы реализуете свое настраиваемое поведение фильтрации (в вашем случае вызов trim()), перезаписывая getFilter() и publishResults(). Здесь или здесь вы можете найти примеры того, как это сделать,

Ответ 4

Я думаю, что есть проблемы в текстовом наблюдателе, потому что автоматическое полное текстовое представление не нуждается в текстовом наблюдателе, потому что это событие автоматического прослушивания. вы должны просто передать свой массив в адаптер вместо списка. alAutoCompleteList ther не имеют никакого значения в списке. вы никогда не добавляли значение в список.

  • либо вам нужно сделать:  alAutoCompleteList.add( "данные один" );  alAutoCompleteList.add( "данные два" );

  • или передать dataArray в адаптер. adapter1 = новый ArrayAdapter (MainActivity.this,       android.R.layout.simple_dropdown_item_1line, dataArray);

  • Нет необходимости использовать наблюдателя текста.