2016-07-14 4 views
0

У меня есть AutoCompleteTextViewsearchFriends и String[] usernames= {"Lex","Lincoln","Luther"}, которые я получаю из базы данных.AutoCompleteTextview не показывает выпадающее предложение для ввода первого символа

Проблема: В первый раз, когда я печатаю букву «L» в AutoCompleteTextView, никаких предложений не отображается. Если я нажму 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); 
} 
} 

ответ

0

Я работал вокруг этой проблемы, заменив текст с тем же текстом в EditText момент, после того, как адаптер создан:

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 
    ); 
} 
1

После того как вы весь список в адаптере, это так просто, как это:

@Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     Filterable adapter = (Filterable) searchFriends.getAdapter(); 
     adapter.getFilter().filter(s); 
    } 
+0

он говорит, что не может решить метод: фильтр –

+0

Упс. Обновленный ответ. –

+0

Я получаю эту ошибку nullpointer java.lang.NullPointerException: пытается вызвать виртуальный метод 'android.widget.Filter android.widget.ArrayAdapter.getFilter()' на ссылке нулевого объекта –

1

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

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

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

+0

Пробовал, но это не имело значения –